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

时间:2016-03-14 20:55:15

标签: c# sql sql-server database-connection sql-insert

我正在尝试将数据适配器正确绑定到我的SQL数据库,以插入一个人在c#程序中提交的记录。我觉得我已经80%了,但现在我遇到了麻烦。

因此,在下面的代码中,我可以很好地创建和绑定数据表。我已经测试了删除功能,它们工作得很好。我现在正试图让“保存”按钮向我的数据库插入一个新行。我现在遇到的问题是用户应该输入他们的“笔记”,然后点击保存。我自动填充其余列,但我不知道如何抓取用户输入的注释。

到目前为止,这是我的代码:

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命令。我假设由于删除和更新都没有,因此插入也不会。这似乎解决了这个问题。谢谢大家的帮助。

2 个答案:

答案 0 :(得分:3)

您只需使用DataAdapter对象即可将记录插入SQL数据库,而不需要Command,如下面的代码片段所示(只需传递您的Insert SQL语句字符串):

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 String / Command添加参数来进一步扩展此解决方案,以防止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 :(得分:1)

在我看来,你有点失落。适配器的工作方式是

  • 通过适配器从数据库填充表(或取空表)
  • 将表绑定到GUI或手动将信息传输到GUI
  • 通过绑定或手动更改/添加/删除表中的数据
  • 通过适配器更新(插入/更新/删除)更改到数据库

自动跟踪表中的更改,因此适配器知道应该更新/插入/删除的内容并使用适当的命令。

如果您使用适配器作为命令的持有者您可以使用任意参数执行ExecuteNonQuery,您可以传递整个概念,根本不需要适配器(请参阅@AlexBells答案)。

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