已声明Sql参数

Ree*_*son 4 c# sql sql-server

所以我正在尝试使用SQL中的参数,因为在我的数据库中有人有一个姓名为"O'Brien",你可以想象没有使用参数这会让我很多地狱,在你开始尖叫我之前告诉我我应该有我一直在使用paramaterised查询,我是非常新的正确使用SQL而没有时间学习如何正确地做到这一点所以我刚才一直在使用字符串查询,所以我的代码如下:

//string constr = ConfigurationManager.ConnectionStrings["EBSLIVE"].ConnectionString;
string constr = ConfigurationManager.ConnectionStrings["EBSTEST"].ConnectionString;
DataTable dt = new DataTable();
using (SqlConnection con = new SqlConnection(constr))
{
    using(SqlCommand cmd = new SqlCommand())
    {
        foreach (string name in StringNames)
        {
            string[] StuName = name.Split('|');
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = "Select MOBILE_PHONE_NUMBER as Number From people Where FORENAME = @FORENAME and SURNAME = @SURNAME and PERSON_CODE = @PERSONCODE";

            cmd.Parameters.AddWithValue("@PERSONCODE", StuName[0]);
            cmd.Parameters.AddWithValue("@FORENAME", StuName[1]);
            cmd.Parameters.AddWithValue("@SURNAME", StuName[2]);
            cmd.CommandType = CommandType.Text;
            using (SqlDataAdapter sda = new SqlDataAdapter())
            {
                cmd.Connection = con;
                sda.SelectCommand = cmd;
                using (DataSet ds = new DataSet())
                {
                    DataTable ndt = new DataTable();
                    sda.Fill(ndt);
                    dt.Merge(ndt);
                }
            }
        }
    }              
}
Numbers.AddRange(dt.Rows.OfType<DataRow>().Select(dr => dr.Field<string>("Number")).ToList());
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,它告诉我@PERSONCODE已经被宣布.我不知道最近发生了什么.任何帮助,将不胜感激.

myb*_*ame 5

foreach (string name in StringNames)
{
   using(SqlCommand cmd = new SqlCommand())
   {
        string[] StuName = name.Split('|');
        cmd.Parameters.AddWithValue("@PERSONCODE", StuName[0]);
        cmd.Parameters.AddWithValue("@FORENAME", StuName[1]);
        cmd.Parameters.AddWithValue("@SURNAME", StuName[2]);
        cmd.CommandText = "Select MOBILE_PHONE_NUMBER as Number From people Where FORENAME = @FORENAME and SURNAME = @SURNAME and PERSON_CODE = @PERSONCODE";
        cmd.CommandType = CommandType.Text;

        //your other stuff and merging to the main dt.
   }
}
Run Code Online (Sandbox Code Playgroud)

您应该将声明放在循环SqlCommand内foreach。在每次迭代中,您都会再次定义参数,这会导致此错误。

编辑:如果您想重用相同的命令,只需在循环的开头调用:

foreach (string name in StringNames)
{
    cmd.Parameters.Clear();
    //other stuff.
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*ter 5

您使用相同SqlCommand的不同DataAdapters,但您正在循环中创建和添加参数,因此SqlCommand获取具有相同名称的多个参数.那当然是不允许的.

你不需要,SqlCommand但DataAdapter.SelectCommand每次都可以重复使用.我不会用AddWithValue:

using (SqlConnection con = new SqlConnection(constr))
using (SqlDataAdapter da = new SqlDataAdapter("Select MOBILE_PHONE_NUMBER as Number From people Where FORENAME = @FORENAME and SURNAME = @SURNAME and PERSON_CODE = @PERSONCODE", con))
{
    var cmd = da.SelectCommand;
    cmd.Parameters.Add("@PERSONCODE", SqlDbType.NVarChar);
    cmd.Parameters.Add("@FORENAME", SqlDbType.NVarChar);
    cmd.Parameters.Add("@SURNAME", SqlDbType.NVarChar);

    foreach (string name in StringNames)
    {
        string[] StuName = name.Split('|');
        cmd.Parameters["@PERSONCODE"].Value = StuName[0];
        cmd.Parameters["@FORENAME"].Value = StuName[1];
        cmd.Parameters["@SURNAME"].Value = StuName[2];

         DataTable ndt = new DataTable();
         da.Fill(ndt);
         dt.Merge(ndt);
    }
}
Run Code Online (Sandbox Code Playgroud)