C# C-系统数据SqlClient SqlException

C# C-系统数据SqlClient SqlException,c#,sql,sql-server,sqlexception,C#,Sql,Sql Server,Sqlexception,因此,我正在调试一个我一直在开发的程序,该程序将向用户发送一封电子邮件,该电子邮件将向用户发送一封包含客户试图进入移动应用程序时出错信息的电子邮件。我遇到的问题是,即使我设置了参数,我仍会收到以下错误消息: 参数化查询'@USER\u NAME varchar8000SELECT USER\u NAME,EMAIL,FIRST\u NAME,L'需要未提供的参数'@USER\u NAME' 我以前从来没有遇到过这个错误,所以我不确定我的代码中是否缺少什么东西,或者我只是输入了错误的语法。下面是发

因此,我正在调试一个我一直在开发的程序,该程序将向用户发送一封电子邮件,该电子邮件将向用户发送一封包含客户试图进入移动应用程序时出错信息的电子邮件。我遇到的问题是,即使我设置了参数,我仍会收到以下错误消息:

参数化查询'@USER\u NAME varchar8000SELECT USER\u NAME,EMAIL,FIRST\u NAME,L'需要未提供的参数'@USER\u NAME'

我以前从来没有遇到过这个错误,所以我不确定我的代码中是否缺少什么东西,或者我只是输入了错误的语法。下面是发生错误的方法以及此方法使用的类:

方法:

private static MyHomeInformation GetUserDataFromMyHome(string username)
    {
        MyHomeInformation myHomeInformation = null;
        using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.MyHomeConnectionString))
        {
            SqlCommand sqlError = connection.CreateCommand();
            sqlError.CommandText = @"SELECT USER_NAME, EMAIL, FIRST_NAME, LAST_NAME, TRAVELER_UID FROM TANDT_PORTAL.dbo.[USER] WHERE USER_NAME = @USER_NAME";
            sqlError.Parameters.Add("@USER_NAME", System.Data.SqlDbType.VarChar);

            connection.Open();
            SqlDataReader reader = sqlError.ExecuteReader();

            if (reader.Read())
            {
                myHomeInformation = new MyHomeInformation();
                myHomeInformation.myHomeUserName = Utilities.FromDBValue<string>(reader["USER_NAME"]);
                myHomeInformation.myHomeEmail = Utilities.FromDBValue<string>(reader["EMAIL"]);
                myHomeInformation.myHomeFirstName = Utilities.FromDBValue<string>(reader["FIRST_NAME"]);
                myHomeInformation.myHomeLastName = Utilities.FromDBValue<string>(reader["LAST_NAME"]);
                myHomeInformation.myHomeTravelerUID = Utilities.FromDBValue<Guid>(reader["TRAVELER_UID"]);
            }
        }
        return myHomeInformation;
    }

以下是使用参数集合添加函数的正确方法示例:

SqlParameter param = new SqlParameter("@USER_NAME", SqlDbType.NVarChar, 8000);
param.Value = "Sam";
sqlError.Parameters.Add(param);
注意将值设置为Sam


如果不想创建param变量,也可以使用函数AddWithValue。但是,@JoelCoehoorn会担心性能问题-请参见问题注释这里是一个正确使用参数集合添加功能的示例:

SqlParameter param = new SqlParameter("@USER_NAME", SqlDbType.NVarChar, 8000);
param.Value = "Sam";
sqlError.Parameters.Add(param);
注意将值设置为Sam


如果不想创建param变量,也可以使用函数AddWithValue。但是,@JoelCoehoorn会担心性能问题-请参阅问题注释更改sqlError.Parameters.Add到AddWithValue


将sqlError.Parameters.Add更改为AddWithValue


将参数添加到调用中,但不给参数任何值

改变

sqlError.Parameters.Add("@USER_NAME", System.Data.SqlDbType.VarChar); 


将参数添加到调用中,但不给参数任何值

改变

sqlError.Parameters.Add("@USER_NAME", System.Data.SqlDbType.VarChar); 


您没有为where子句提供@USER\u NAME参数。已创建@USER\u NAME参数,但从未设置该值。您可能希望对该子句使用AddWithValue而不是Addparameter@Hogan避免使用AddWithValue。它可能存在性能问题。@X-TECH在where子句中,虽然我有USER\u NAME=@USER\u NAME,但我不是在where子句中提供了它吗?您没有为where子句提供@USER\u NAME参数。创建了@USER\u NAME参数,但该值从未设置。您可能希望对parameter@Hogan避免使用AddWithValue。它有潜在的性能问题。@X-TECH在where子句中,虽然我有USER\u NAME=@USER\u NAME,那么我不是在where子句中提供了它吗?避免AddWithValue,而使用Add重载。它将设置参数的显式类型。AddWithValue的参数类型不匹配可能会导致较大的性能问题。请避免AddWithValue,以支持Add重载,因为它会设置参数的显式类型。AddWithValue的参数类型不匹配可能会导致严重的性能问题。
sqlError.Parameters.Add("@USER_NAME", System.Data.SqlDbType.VarChar).value = username;