我正在尝试将文本插入一些文本框中,并将其插入到我访问过的数据库中。代码不会产生任何错误,但似乎没有将项目添加到数据库中。
数据库称为“数据库”,该表称为“TotalPlayerName”,该字段称为“玩家名称”。 表中还有其他字段。
for(int i = 0; i < numberOfPlayers; i++){
using (OleDbConnection connection = new OleDbConnection(@"CONNECTION STRING"){
using (OleDbCommand command = new OleDbCommand(@"INSERT INTO TotalPlayerName ([Player Name]) VALUES(@p1)", connection)){
connection.Open();
command.Parameters.Add("@p1", OleDbType.VarWChar).Value = Convert.ToString(textBox[i].Text);
command.ExecuteNonQuery();
}
}
}
答案 0 :(得分:1)
您可能只需要声明@ p1,因为您在INSERT语句中调用它,但它永远不会被定义为变量,例如:varchar,int,ect,ect。这可能适用于您要执行的操作:
using (OleDbCommand command = new OleDbCommand(@"DECLARE @p1 VARCHAR(50) INSERT INTO TotalPlayerName ([Player Name]) VALUES(@p1)", connection)){
另外,如果可能的话,我肯定会把它作为存储过程。这适用于SQL不确定它是否适用于MS Access,但我想是这样。您可能想要做的另一件事是确保它找到了正确的数据库。
Database.dbo.TotalPlayerName
但这可能不是问题,可能只是缺乏变量声明。
答案 1 :(得分:1)
虽然我没有看到您的代码有什么特别的错误,但我可以告诉您,您的方法有点偏差。具体来说,对于循环的每次迭代,您都是:
如果你做了第1步和第2步的一部分然后在循环中执行了这样的语句会更好:
using (OleDbConnection conn = new OleDbConnection(
@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\foo.accdb"))
{
conn.Open();
OleDbCommand command = new OleDbCommand(
@"INSERT INTO TotalPlayerName ([Player Name]) VALUES (@p1)", conn);
command.Parameters.Add(new OleDbParameter("@p1", OleDbType.VarChar));
for (int i = 0; i < numberOfPlayers; i++)
{
command.Parameters[0].Value = textbox[i].Text;
try
{
command.ExecuteNonQuery();
}
catch (Exception ex)
{
// do something
}
}
conn.Close();
}
我假设textbox
是实际文本框控件的数组或列表。如果是这种情况,那么textbox[i].Text
已经是一个字符串,你不需要做任何特殊的事情来使OLE识别它。
最后一点 - 添加try / catch并在那里放置一个断点。你确定它没有失败吗?如果您在调试模式下运行,则无法保证程序将停止 - 它可能只返回到表单而不报告任何错误。可能直到您尝试部署应用程序时才会看到发生的实际错误。