2017-03-19 1 views
0

私は1つの問題で立ち往生しており、私はこれを解決できません。 私はこのエラーを取得:無効な列名: "値" - エラー別のフォームでも機能します。

Error Message

That's the relevant table

コード:

SqlConnection connection = new SqlConnection(connectionString); 
     connection.Open(); 
     string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = " + @departmentCB.Text; 
     SqlCommand command = new SqlCommand(query, connection); 
     command.Parameters.AddWithValue("@nextMaintainance", nextMaintainanceDT.Value); 
     command.ExecuteNonQuery(); 

私は理解していない奇妙なことは、同様のコードがすべてのエラーでなしだけで正常に動作していることです私のプロジェクト:

query = "UPDATE LDV SET received = @received, department = @department WHERE Id =" + @idTxt.Text; 
      command = new SqlCommand(query, connection); 
      command.Parameters.AddWithValue("@received", inDT.Value); 
      command.Parameters.AddWithValue("@department", departmentCb.Text); 
      command.ExecuteNonQuery(); 
      MessageBox.Show("Lungenautomat wurde aktualisiert"); 

関連がある場合は、私の接続文字列:

connectionString = ConfigurationManager.ConnectionStrings["SCBA_Manager_0._1.Properties.Settings.SCBAmanagerConnectionString"].ConnectionString; 

私は本当にあなたが私を助けることができると思います:( ありがとうございます!

答えて

1

departmentの列はテキスト列です。値と比較すると、値を引用符で囲む必要があります。一方

// This fix is not the recommended approach, see the explanation after this code block 
string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = '" + departmentCB.Text + "'"; 
                        // ^--------------------------^------ single quote added to wrap the value returned by departmentCB.Text 

ので、そこにあなたが正しく@departmentパラメータの値を追加するためにParameters.AddWithValue()メソッドを使用しているため、とidは数値列であるため、このエラーは、2番目の例では発生しません。引用符で囲まれた値は必要ありません。

しかし、上記のコードはジョブを実行しますが、ジョブを実行する正しい方法ではありません。正しい方法は、すべての値をクエリに注入するためにパラメータを使用することです。上記のクエリでは、一部の値(たとえば、最初のクエリのnextMaintenance、2番目のクエリのreceivedおよびdepartmentなど)のパラメータは正しく使用されていますが、最初のクエリのdepartment二番目)。

パラメータ化されたSQLの使用法

パラメータ化されたSQLを使用する利点は、それが自動的に引用符を追加するの世話をするということである、などのため

、SQLインジェクションを防ぐ、その最良のあなたの最初のコードブロックを変更するにはTo:文字列queryは、2つのパラメータが含まれていることを任意の厄介連結せずに単一の文字列であり、どのように

SqlConnection connection = new SqlConnection(connectionString); 
connection.Open(); 
string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = @department"; 
SqlCommand command = new SqlCommand(query, connection); 
command.Parameters.AddWithValue("@department", departmentCb.Text); 
command.Parameters.AddWithValue("@nextMaintainance", nextMaintainanceDT.Value); 
command.ExecuteNonQuery(); 

お知らせと@department?そして、これらのパラメータの値が、次の行にParameters.AddWithValue()を使って正しく注入されていますか?

Id列のパラメータを使用すると、2番目のコードブロックを同様に改善できます。

query = "UPDATE LDV SET received = @received, department = @department WHERE Id = @Id "; 
command.Parameters.AddWithValue("@Id", idTxt.Text); 

詳細情報 Doがパラメータ化クエリがある理由をどのようにさまざまなセキュリティ上の問題につながることができ、元のコードのように文字列の連結を使用して、表示されるように、SQLインジェクション(https://technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx)について読ん

SQLクエリに動的な値を注入するための好ましい方法。

あなたがここにパラメータ化クエリの詳細を読むことができます:それはそう

WHERE department = 'Kasseedorf' 

ラインでなければなりませんwherasあなたの最初の例ではhttps://msdn.microsoft.com/en-us/library/yy6y35y8(v=vs.110).aspx

+1

私はこれを試しましたが、うまくいきませんでした。今度はもう一度試してみました。奇妙な、しかしたくさんありがとう! しかし、このようなさらなるエラーを避けるために、私はパラメータ化されたSQLを試してみるでしょうあなたのヒントありがとう! – USAfirefighter

+0

あなたは歓迎です、@USAfirefighter。この回答があなたの問題を解決するのに役立った場合は、_Answered_ – Phylyp

0

を、WHERE句は

WHERE department = Kasseedorf 

に評価します

string query = "UPDATE CAC SET nextMaintainance = @nextMaintainance WHERE department = '" + @departmentCB.Text +"'"; 

2番目の例では、idが整数であり、引用符を入れていないために動作します。

+0

と記入してください。私はこれを試しましたが、うまくいきませんでした。今度はもう一度試してみました。奇妙な、しかしたくさんありがとう! – USAfirefighter

関連する問題