使用C#数据对象将记录插入到SQL Server数据库

问题描述:

我试图正确地将数据适配器绑定到我的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

您只需通过使用如下面的代码片段所示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语句中。

希望这可能有所帮助。

在我看来,你有点迷路。适配器是为了工作的方式是

  • 填充表从数据库经由适配器(或采取空表)
  • 绑定表来GUI或手动转移该信息来GUI
  • 改变/添加/在删除数据通过通过适配器结合或手动
  • 更新改变(插入/更新/删除)到数据库

表的变化表会自动跟踪,因此适配器知道,应该怎样更新/插入/ DELE并使用适当的命令。

如果使用适配器只是作为一个命令你可以用任意参数的ExecuteNonQuery持有人,您传递的整个概念,并不需要在所有适配器(见@AlexBells接听)。

除此之外,你真的要手工编写所有的管道代码?人生如此短暂。如果我是你,我会寻找一些ORM。您可以毫不费力地进行简单的CRUD或并发检查。