2016-12-05 76 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在他的回答中說道,