2016-12-05 91 views
4

所以我想使用SQL参数,在我的数据库有人的“奥布莱恩”你可以不使用参数想象一个姓这引起了我很多地狱,然后再开始尖叫在我告诉我,我应该已经使用paramaterised查询,我很新,正确使用SQL,并没有时间来学习如何正确地做到这一点,所以我刚刚使用字符串查询的时间因此,我的代码如下: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()); 

但由于某种原因它告诉我@PERSONCODE已被声明。我不知道发生了什么。任何帮助,将不胜感激。

+0

在commandtext语句下移动参数语句 – BugFinder

+0

我怀疑你应该切换'using'和'foreach'-loop的顺序,所以在foreach循环中包装使用,你很好去 – nozzleman

+0

还是不行工作后,我做了 –

回答

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); 
    } 
} 
+0

啊好吧,现在有道理,谢谢我欣赏它! –

4
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. 
    } 
} 

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

编辑:如果你想重复使用相同的命令只需要调用在循环乞讨:

foreach (string name in StringNames) 
{ 
    cmd.Parameters.Clear(); 
    //other stuff. 
} 
+0

好的,所以我需要每次都使用新命令?我不能只重新定义参数? –

+0

其他可能性是在foreach循环的乞讨中调用cmd.Parameters.Clear()。 – mybirthname

1

您在循环之外创建了一个命令,然后添加循环内的参数。当然,参数已经在那里了。

我第二你使用同一命令各地所有的循环,以避免重新创建它,但你必须重新构造你的代码的方法:

using(SqlCommand cmd = new SqlCommand()) 
{ 
    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.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]); 

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

你甚至可以申报数据Tim在他的回答中说道,