2011-08-12 7 views
-5

SQL SELECT文を使用してAccessデータベースのバックグラウンドからアクセスしていますが、SQL Serverデータベースにデータをプッシュしてレコードを更新する作業が増えています。 SQL Serverでレコードを追加する際の最初の理解には、INSERTコマンドを含む非常に長いステートメントが必要でした。これは私にとっては不必要に複雑に思えますし、今日は.NETでもっとシンプルにする必要があると信じています。SQL Serverテーブルに単純な行を追加または更新できません

私はそれらのどれも私のコードがそれにエラーがないという事実にもかかわらず、私のために動作しないなど、DataTableDataSetSqlCommandSqlAdaptersのために研究され、いくつかのコードサンプルを検討しています。私はいくつかの助けのためにスタックオーバーフローに魅力的であるこれらの例の非常に多くの変異を経験しました。

ここに私がしていることがあります。 SQL Serverへの

  1. 接続し、外部(作品を!)ホストさ
  2. を開き、単一のテーブルDonglesと呼ばれます。
  3. シリアル番号を基準として行を確認します。
  4. 存在する場合は、レコードを更新します。
  5. そうでない場合は、新しいレコードを追加します。

私が扱ったコードサンプルの最新の変異を提供しています。コードを実行する前に、データベースに1レコードを手動で追加したので、SerialNumber引数が一致することがわかりました。残念ながら、if (dt.Rows.Count > 0)ステートメントはfalseを返し、更新は一度も試みられません。

ここで私はこれを伝えます....私は、各フィールドを更新する行を成功裏に通過した他の突然変異を試みました。しかし、Update()関数が呼び出されると(正常に)、実際のデータベースには何も伝播されませんでした。

ここでは、コードです:

SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = " + m_dongle.SerialNumber, server.SQLConnection); 
SqlDataAdapter da = new SqlDataAdapter(cmd); 
SqlCommandBuilder cb = new SqlCommandBuilder(da); 

DataTable dt = new DataTable(); 
da.Fill(dt); 

if (dt.Rows.Count > 0) 
{ 
    dt.Rows[0]["IsLeased"] = m_dongle.IsLeased == true ? 1 : 0; 
    dt.Rows[0]["LeaseDaysRemaining"] = m_dongle.LeaseDaysRemaining; 
    dt.Rows[0]["DateAssigned"] = DateTime.Now; 
    dt.Rows[0]["ConfiguredBy"] = m_dongle.ConfiguredBy; 
    dt.Rows[0]["LicenseHolder"] = m_dongle.LicenseHolder; 
    dt.Rows[0]["ContactName"] = m_dongle.ContactName; 
    dt.Rows[0]["ContactPhone"] = m_dongle.ContactPhone; 
    dt.Rows[0]["ContactEmail"] = m_dongle.ContactEmail; 
    dt.Rows[0]["SerialNumber"] = m_dongle.SerialNumber; 
    dt.Rows[0]["IsNetworkDongle"] = m_dongle.IsNetworkDongle; 
    dt.Rows[0]["NetworkMaxUsers"] = m_dongle.NetworkMaxUsers; 
    dt.Rows[0]["NetworkAbsoluteMaxUsers"] = m_dongle.NetworkAbsoluteMaxUsers; 
    dt.Rows[0]["IsAssigned"] = m_dongle.IsAssigned; 
    dt.Rows[0]["DongleModel"] = m_dongle.DongleModel; 
    dt.Rows[0]["SalesforceID"] = m_dongle.SalesforceID; 

    da.Update(dt); 

    MessageBox.Show("Dongle profile updated successfully.", "Profile Saved", 
        MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
} 
+2

ado.net&DataTableには、あなたには、いくつかの魔法を愛していればあなたは、いくつかのORMの例Entity Frameworkのためのツールとを確認することができ、あなたのためにあまりにも複雑である場合:) –

+3

ちょっとしたJD、**答えを受け入れるには、答えの左側にあるチェックボックスの概要をクリックしてください**。人々はそれを感謝し、将来的にはより喜んで助けてくれるだろう。ここで他の多くの人々と同様に、私はあなたのためのソリューションを持っていますが、あなたが戻って与えていないので、それを与えることはありません...申し訳ありません –

+0

'where'節なしでそれを試してください。 –

答えて

4

SerialNumberある列のどのような?文字列の場合は、パラメータの前後に引用符を付ける必要があります。SQLインジェクション攻撃を防ぐためには、をのクエリを使用してください。必要な場合、パラメータが自動的に)、値の前後に引用符を使用します。

SqlCommand cmd = new SqlCommand("SELECT * FROM Dongles WHERE SerialNumber = @SerialNo", server.SQLConnection); 

cmd.Parameters.Add("@SerialNo", SqlDbType.VarChar, 50).Value = m_dongle.SerialNumber.Trim(); 

SqlDataAdapter da = new SqlDataAdapter(cmd); 
SqlCommandBuilder cb = new SqlCommandBuilder(da); 

DataTable dt = new DataTable(); 
da.Fill(dt); 

if (dt.Rows.Count > 0) 
{ 
    ....... 
} 
関連する問題