2012-03-03 12 views
1

こんにちは私は、SQLデータベーステーブルへの更新機能のエラーに遭遇しています。エラーは次のとおりです。SQLテーブルのローを更新するオペランドタイプクラッシュエラー

Error: Operand type clash: text is incompatible with smallint 

そして、私はどこかのタイプintのない値があってはならない何かが間違っている見当がつかない。すべての入力は文字列で、表の列のタイプはすべてテキストです。更新機能はこれです:

public static void UpdateRows(string table, string columnToGet, string columnValueGet, string columnToSet, string columnValueToSet) 
{ 
    try 
    { 
    SqlConnection connection = new SqlConnection(Global.connectionString); 
    string updateString = "UPDATE " + table + " " + "SET " + columnToSet + "=" + columnValueToSet + " WHERE " + columnToGet + "=" + columnValueGet; 
    Console.WriteLine(updateString); 

    using (SqlCommand cmd = new SqlCommand(updateString, connection)) 
    { 
     connection.Open(); 
     cmd.Parameters.AddWithValue("@" + columnToSet, "'" + columnValueToSet + "'"); 
     cmd.Parameters.AddWithValue("@" + columnToGet, "'" + columnValueGet + "'"); 

     cmd.ExecuteNonQuery(); 
     connection.Close(); 
    } 

} 
catch (SqlException ex) 
{ 
    Console.WriteLine("Error: " + ex.Message); 
    throw; 
} 
} 

コンソールは、このような文字列を出力:

UPDATE parentDirectory SET Child1ID=50042 WHERE ParentID=10020 

をし、エラーが表示されます。なにが問題ですか?私は値変数に "'"文字を追加しようとしましたが、別のエラーが発生します。私は別の場所と同じフォーマットで私の挿入関数の並べ替えを持っているとうまく動作します。助けてください。

答えて

2

列名はパラメータであってはなりません。パラメータに列名を含めることにより、columnValueToSetは数値として扱われます。 PS:これは魚のようなデザインです。 PPS:SQLインジェクションまでそれを開きます。

public static void UpdateRows(string table, string columnToGet, 
      string columnValueGet, string columnToSet, string columnValueToSet) 
{ 
    try 
    { 
     SqlConnection connection = new SqlConnection(Global.connectionString); 
     string updateString = 
        "UPDATE " + table + " " + 
        "SET " + columnToSet + "= @columnValueToSet " + 
        "WHERE " + columnToGet + "= @columnValueGet;"; 
     Console.WriteLine(updateString); 

     using (SqlCommand cmd = new SqlCommand(updateString, connection)) 
     { 
      connection.Open(); 
      cmd.Parameters.AddWithValue("@columnValueToSet", columnValueToSet); 
      cmd.Parameters.Add("@columnValueGet", SqlDbType.Text).Value= columnValueGet; 
      cmd.ExecuteNonQuery(); 
      connection.Close(); 
     } 
    } 
    catch (SqlException ex) 
    { 
     Console.WriteLine("Error: " + ex.Message); 
     throw; 
    } 
} 

EDIT:GarethDが指摘したように、重要な問題はPARENTIDがテキストとして定義されていることで、テキストとint型の間に変換は(そこvarchar型とint型の間にあるが、テキストおよびint型ではない)ありません。

+0

このソリューションは機能しますが、OPのソリューションが機能していなかった理由は、text/int間の暗黙の変換がないので、列名をパラメータとして追加することではないことを指摘しておきましょう。WHERE ParentID = 10020はParentIDがテキストで10020がINTなので失敗するので、SQLはそれらを比較する方法を知らない。 – GarethD

+0

このソリューションはこれを返します: 'UPDATE parentDirectory SET Child1ID = @ columnValueToSet WHERE ParentID = @ columnValueGet エラー:データ型textとnvarcharが等しい演算子で互換性がありません。 ' – ikathegreat

+0

と" fishy design " 'textbox'のようなフォームコントロールを使って' SqlCommand'文字列を構築する方法に関する良いリソースを見つけてください。私が見た例は、ハードコードされた値です(私は 'foo'を使用していません!)。このアプリケーションでは、ユーザは単純にいくつかの値をボックスに書き込んでおり、更新関数は一致する行を見つけ、値。私はちょうどこれを正しく実行する方法を知らない。 – ikathegreat

関連する問題