使用 C# 数据对象将记录插入 SQL 服务器数据库
Insert Records into SQL Server Database using C# Data Objects
我正在尝试将数据适配器正确绑定到我的 SQL 数据库,以在 c# 程序中插入一个人提交的记录。我觉得我已经完成了 80%,但现在我遇到了一个问题。
所以在下面的代码中,我可以很好地创建和绑定数据 Table。我已经测试了删除功能,它们工作得很好。我现在正尝试让 'save' 按钮向我的数据库插入一个新行。我现在遇到的问题是用户应该输入 'notes' 然后点击保存。我自动填充了其余的列,但我不知道如何获取用户输入的注释。
到目前为止,这是我的代码:
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 查看我的数据 Table 时,我可以在正确的列中看到注释,但我不知道如何简单地保存它。
感谢任何帮助。谢谢
编辑:
我不知道的是 InsertCommand(自然地)也需要 ExecuteNonQuery 命令。我假设既然 Delete 和 Update 都没有,那么 Insert 也不会。这似乎解决了这个问题。感谢大家的帮助。
您可以将记录插入 SQL 数据库而无需 DataAdapter
只需使用 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;
注意:如果ParticipantID
是IDENTITY
(即自动编号)列,则不要将其包含在 INSERT 语句中。
希望这可能有所帮助。
我觉得你有点迷茫。适配器的工作方式是
- 通过适配器从数据库中填充 table(或取空 table)
- 将 table 绑定到 GUI 或手动将信息传输到 GUI
- change/add/delete 中的数据 table 通过绑定或手动
- 更新通过适配器将更改 (inserts/updates/deletes) 写入数据库
自动跟踪 table 中的更改,因此适配器知道应该 updated/inserted/deleted 并使用适当的命令。
如果您将适配器用作命令的持有者,您可以使用任意参数执行 ExecuteNonQuery,您传递了整个概念并且根本不需要适配器(请参阅@AlexBells 回答)。
除此之外,您真的要手动编写所有管道代码吗?人生如此短暂。如果我是你,我会寻找一些 ORM。您可以毫不费力地获得简单的 CRUD 或并发检查。
我正在尝试将数据适配器正确绑定到我的 SQL 数据库,以在 c# 程序中插入一个人提交的记录。我觉得我已经完成了 80%,但现在我遇到了一个问题。
所以在下面的代码中,我可以很好地创建和绑定数据 Table。我已经测试了删除功能,它们工作得很好。我现在正尝试让 'save' 按钮向我的数据库插入一个新行。我现在遇到的问题是用户应该输入 'notes' 然后点击保存。我自动填充了其余的列,但我不知道如何获取用户输入的注释。
到目前为止,这是我的代码:
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 查看我的数据 Table 时,我可以在正确的列中看到注释,但我不知道如何简单地保存它。
感谢任何帮助。谢谢
编辑: 我不知道的是 InsertCommand(自然地)也需要 ExecuteNonQuery 命令。我假设既然 Delete 和 Update 都没有,那么 Insert 也不会。这似乎解决了这个问题。感谢大家的帮助。
您可以将记录插入 SQL 数据库而无需 DataAdapter
只需使用 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;
注意:如果ParticipantID
是IDENTITY
(即自动编号)列,则不要将其包含在 INSERT 语句中。
希望这可能有所帮助。
我觉得你有点迷茫。适配器的工作方式是
- 通过适配器从数据库中填充 table(或取空 table)
- 将 table 绑定到 GUI 或手动将信息传输到 GUI
- change/add/delete 中的数据 table 通过绑定或手动
- 更新通过适配器将更改 (inserts/updates/deletes) 写入数据库
自动跟踪 table 中的更改,因此适配器知道应该 updated/inserted/deleted 并使用适当的命令。
如果您将适配器用作命令的持有者,您可以使用任意参数执行 ExecuteNonQuery,您传递了整个概念并且根本不需要适配器(请参阅@AlexBells 回答)。
除此之外,您真的要手动编写所有管道代码吗?人生如此短暂。如果我是你,我会寻找一些 ORM。您可以毫不费力地获得简单的 CRUD 或并发检查。