2016-12-05 20 views
4

私は自分のデータベースと同じようにSQLでパラメータを使用しようとしています。パラメータを使用せずに想像できるように、誰かが "O'Brien"という姓を持っています。パラメタリゼーションされたクエリを使用していたはずですが、私は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'ループの順序を変えるべきだと思うので、foreachループの中で使うことをラップしてください。 – nozzleman

+0

まだありません私はそれをした後に働いています –

答えて

5

あなたは異なるDataAdaptersに同じSqlCommandを使用しているが、あなたはパラメータを作成して追加しますループ内では、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. 
    } 
} 

あなたはforeachループ内SqlCommandの宣言を置く必要があります。すべての反復で、このエラーにつながるパラメーターを再度定義しています。

EDIT:あなたは同じコマンドを再利用したい場合は、単にループの物乞いに呼び出す:

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

あなたも、データを宣言することができます彼の答えでティムが言うように、ループ外のアダプター。

関連する問題