2016-03-14 145 views
0

我試圖正確地將數據適配器綁定到我的SQL數據庫,以便將某人在c#程序中提交的記錄插入。我覺得我是80%的路,但現在我碰到了一個麻煩。使用C#數據對象將記錄插入到SQL Server數據庫

因此,在下面的代碼中,我可以創建和綁定數據表就好了。我測試了刪除功能,他們工作得很好。我現在試圖有一個'保存'按鈕插入一個新的行到我的數據庫。我現在的問題是用戶應該放入他們的'筆記'然後點擊保存。我自動填充其餘列,但我不知道如何抓取用戶輸入的註釋。

這是到目前爲止我的代碼:

string userVerify = User.CurrentUser.UserName.ToString(); 
int participantID = this.mParticipant.ParticipantID; 
DateTime date = DateTime.Now; 
string properRow = dtNotes[1, dtNotes.NewRowIndex - 1].Value.ToString(); 

sqlDataAdapter.InsertCommand = new SqlCommand("INSERT INTO xxMyDatabasexx (ParticipantID,Verifier,Notes,Date) VALUES (@participantID,@notes, @userVerify,@date);"); 
sqlDataAdapter.InsertCommand.Parameters.AddWithValue("@participantID", participantID); 
sqlDataAdapter.InsertCommand.Parameters.AddWithValue("@userVerify", userVerify); 
sqlDataAdapter.InsertCommand.Parameters.AddWithValue("@date", date); 
sqlDataAdapter.InsertCommand.Parameters.AddWithValue("@notes", properRow); 

sqlDataAdapter.Fill(dataTable); 

sqlDataAdapter.Update(dataTable); 

我知道,properRow變量的邏輯是錯誤的。當然,如果沒有行,那麼程序會崩潰,但是如果沒有輸入新的註釋,它就會重現輸入的最後一個註釋,當然這也是錯誤的。當我在sqlDataAdapter.Fill時查看我的dataTable時,可以在正確的列中看到註釋,但我不知道如何簡單地保存它。

任何幫助表示讚賞。謝謝。

編輯: 我不知道的是,InsertCommand(自然)也需要ExecuteNonQuery命令。我是在假設,因爲刪除和更新都沒有,該插入不會。這似乎解決了這個問題。感謝所有的幫助。

+0

供參考:像DataAdapter這樣的數據對象綁定到* controls *,它們*連接*到數據庫。 – RBarryYoung

+0

我不BERY年輕,但我會提的是,當你說,「我覺得我的方式80%」,你應該諒解,最後20%的花費80%的時間。 –

+0

隨口說說,在'.Fill'看起來不合適。註釋掉該行並嘗試。 – RBarryYoung

回答

2

您只需通過使用如下面的代碼片段所示Command對象(只是通過你插入SQL語句字符串)插入記錄到SQL數據庫,而不需要DataAdapter

void SqlExecuteCommand(string InsertSQL) 
{ 
    try 
    { 
     using (SqlConnection _connSqlCe = new SqlConnection("Conn String to SQL DB")) 
     { 
      _connSql.Open(); 
      using (SqlCommand _commandSqlCe = new SqlCommand(CommandSQL, _connSql)) 
      { 
       _commandSql.CommandType = CommandType.Text; 
       _commandSql.ExecuteNonQuery(); 
      } 
     } 
    } 
    catch { throw; } 
} 

SQL的一般格式INSERT查詢字符串如下所示:

INSERT INTO YourTable (column1,column2,column3,...) 
VALUES (value1,value2,value3,...); 

可以通過在爲了防止SQL注入的可能性增加參數到SQL字符串/命令(參見下面的實施例)進一步延伸此解決方案:

INSERT INTO YourTable (column1,column2,column3,...) 
VALUES (@param1,@param2,@param3,...); 

_commandSql.Parameters.Add("@param1","abc"); 
_commandSql.Parameters.Add("@param2","def"); 
_commandSql.Parameters.Add("@param3","ghijklm"); 

您還可以使用替代語法SQL Parameters,像如:

_commandSql.Parameters.Add("@param1", SqlDbType.NChar).Value = "abc"; 
_commandSql.Parameters.Add("@param2", SqlDbType.NChar).Value = "def"; 
_commandSql.Parameters.Add("@param3", SqlDbType.NVarChar).Value = "ghijklm"; 

相關的特定的問題,它應該是這樣的:

"INSERT INTO xxMyDatabasexx (ParticipantID, Verifier, Notes, [Date]) VALUES (@participantID, @userVerify, @notes, @dt)" 

_commandSql.Parameters.Add("@ParticipantID",SqlDbType.NChar).Value= participantID; 
_commandSql.Parameters.Add("@userVerify",SqlDbType.NChar).Value= userVerify ; 
_commandSql.Parameters.Add("@notes",SqlDbType.NVChar).Value= properRow ; 
_commandSql.Parameters.Add("@dt",SqlDbType.DateTime).Value= DateTime.Now; 

:如果ParticipantIDIDENTITY(即自動編號)列,則不要將其包含在INSERT語句中。

希望這可能有所幫助。

1

在我看來,你有點迷路。適配器是爲了工作的方式是

  • 填充表從數據庫經由適配器(或採取空表)
  • 綁定表來GUI或手動轉移該信息來GUI
  • 改變/添加/在刪除數據通過通過適配器結合或手動
  • 更新改變(插入/更新/刪除)到數據庫

表的變化表會自動跟蹤,因此適配器知道,應該怎樣更新/插入/ DELE並使用適當的命令。

如果使用適配器只是作爲一個命令你可以用任意參數的ExecuteNonQuery持有人,您傳遞的整個概念,並不需要在所有適配器(見@AlexBells接聽)。

除此之外,你真的要手工編寫所有的管道代碼?人生如此短暫。如果我是你,我會尋找一些ORM。您可以毫不費力地進行簡單的CRUD或併發檢查。

相關問題