C# - 系统数据 SqlClient SqlException

C# - System Data SqlClient SqlException

所以我正在调试一个我已经开发了一段时间的程序,该程序会向用户发送一封电子邮件,该电子邮件将向用户发送一封电子邮件,其中包含有关客户试图进入的错误的信息移动应用。我遇到的问题是即使我已经设置了参数,我还是收到以下错误消息:

The parameterized query '(@USER_NAME varchar(8000))SELECT USER_NAME, EMAIL, FIRST_NAME, L' expects the parameter '@USER_NAME', which was not supplied.

我以前从未遇到过这个错误,所以我不确定我的代码中是否缺少某些内容,或者我是否只是输入了错误的语法。以下是发生错误的方法和此方法使用的 class:

方法:

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;
    }

Class:

class MyHomeInformation
{
    public string myHomeUserName { get; set; }
    public string myHomeEmail { get; set; }
    public string myHomeFirstName { get; set; }
    public string myHomeLastName { get; set; }
    public Guid myHomeTravelerUID { get; set; }  
}

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

SqlParameter param = new SqlParameter("@USER_NAME", SqlDbType.NVarChar, 8000);
param.Value = "Sam";
sqlError.Parameters.Add(param);

注意Sam的值设置。

如果您不想创建 param 变量,也可以使用函数 AddWithValue。 (但是,@JoelCoehoorn 会担心性能问题 - 请参阅问题评论)

将 sqlError.Parameters.Add 更改为 AddWithValue

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.AddWithValue("@USER_NAME", username); // THIS ROW SHOULD BE UPDATED

        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;
}

您将参数添加到调用中,但没有给参数赋值。

改变

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

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