2016-12-04 13 views
1

私のプログラムでは、作成したローカルデータベースの値(私の例では価格)を変更するオプションが必要です。ローカルSQL Serverデータベースの値を更新する方法

私は問題があります。接続はうまく動作し、デバッグがうまくいって、 "okを保存する"というメッセージも表示されますが、データベースではまったく変更されません。

private void button2_Click(object sender, EventArgs e) 
{    
    var con = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\sam\Desktop\hello\hello\DB.mdf;Integrated Security=True"; 

    using (SqlConnection myconnection = new SqlConnection(con)) 
    { 
     try 
     { 
      myconnection.Open();  
      var query = string.Format("update DBTable set price='"+textBox2.Text+"' where ParamToCheck='"+comboBox5.Text+"'"); 
      SqlCommand cm = new SqlCommand(query, myconnection); 

      cm.ExecuteNonQuery(); 

      MessageBox.Show("saved ok !!");  
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

ユーザーがcombobox5から文字列を選択し、番号を入力することにより、textBox2から彼の価格を変更することができます - 私は何をしたいこと - それは変更されません。

+2

SSMSで直接実行するとクエリは機能しますか? – ChrisF

+0

あなたのテーブル/カラム名は本当に 'DBTable'と' ParamToCheck'ですか? さらに、priceがvarchar/nvarcharでない場合は、値を引用符で囲む必要はありません。 – Marco

+1

ExecuteNonQueryは、クエリによって更新された行の数を返します。あなたのメッセージボックスが「保存されました」というメッセージはあなたに真実を伝えません。 _int rowsUpdated = cm.ExecuteNonQuery(); _で確認してから、rowsUpdatedの値を確認してください。 – Steve

答えて

2

SQLクエリを作成する正しい方法は、パラメータを使用し、各列に正しいデータ型を使用することです。今のように文字列を連結することは、多くの種類のエラーに分類される安全なレシピです。単純なのは、データベースエンジンの値を正しく理解できないことです。最悪のものはSQL Injectionと呼ばれ、データベース全体を破壊する可能性があります。私は文字列の連結を使用せずに多くのあなたのクエリテキストを単純化している

var query = "update DBTable set [email protected] where [email protected]"; 
using (SqlConnection myconnection = new SqlConnection(con)) 
using (SqlCommand cm = new SqlCommand(query, myconnection)) 
{ 
    try 
    { 

     myconnection.Open();  
     cm.Parameters.Add("@price", SqlDbType.Decimal).Value = Convert.ToDecimal(textBox2.Text); 
     cm.Parameters.Add("@prm", SqlDbType.NVarChar).Value = comboBox5.Text; 
     int rowsUpdated = cm.ExecuteNonQuery(); 
     if(rowsUpdated > 1) 
      MessageBox.Show("saved ok !!");  
     else 
      MessageBox.Show("No match for condition:" + comboBox5.Text);  
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

お知らせ、代わりにあなたのコマンドを完了するために、データベースエンジンによって使用される2つのパラメータのプレースホルダがあります。その後、特定のデータ型(decimalとnvarchar)の2つのパラメータを追加しました。これらの型は、PriceおよびParamToCheckの列のデータ型と一致する必要があります。

+0

ありがとうございます。 – shlezz

関連する問題