Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法使用c中的参数化查询在MS Access中插入数据#_C#_Ado.net_Oledb - Fatal编程技术网

C# 无法使用c中的参数化查询在MS Access中插入数据#

C# 无法使用c中的参数化查询在MS Access中插入数据#,c#,ado.net,oledb,C#,Ado.net,Oledb,我有以下代码,它试图将3个文本框中的e值存储到MS Access 2007数据库中 string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dxs.accdb"); string SqlString = "Insert Into tests( [Nam], [add], [phone]) Values (?,?,?)"; using (OleDbConnection conn =

我有以下代码,它试图将3个文本框中的e值存储到MS Access 2007数据库中

string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\dxs.accdb");
string SqlString = "Insert Into tests( [Nam], [add], [phone]) Values (?,?,?)";

using (OleDbConnection conn = new OleDbConnection(ConnString))
{
   using (OleDbCommand cmd = new OleDbCommand(SqlString, conn))
   {
      cmd.CommandType = CommandType.Text;
      cmd.Parameters.AddWithValue(@"Nam", textBox1.Text);
      cmd.Parameters.AddWithValue(@"add", textBox2.Text);
      cmd.Parameters.AddWithValue(@"phone",textBox3.Text);

      conn.Open();
      cmd.ExecuteNonQuery();
      MessageBox.Show("entered");
   }
}

但即使输入值后代码是正确的,表中也没有存储任何内容。

当我遇到类似问题时,解决方案是:

如果数据库是应用程序的一部分,则可以将其复制到
bin
文件夹中,然后应用程序使用它。这就是为什么使用MS Access客户端无法在数据表中找到您的更改。

不应该这样做

cmd.Parameters.AddWithValue(@“Nam”,textBox1.Text)

是:

cmd.Parameters.AddWithValue(“@Nam”,textBox1.Text)


对于其他参数,依此类推?

确保数据库存在于项目的
exe
文件所在的输出(bin)文件夹中。如果没有,则复制到那里。将
数据库
文件放在正确的位置后,您将看到更改

此外,您还需要在代码中进行一些更改,因为您的参数有问题。 将
值(?,?)
更改为
值(@Nam,@add,@phone)”;
@“Nam”
更改为
“@Nam”
。请参阅注释
更正1和更正2

在字符串开头使用
@
时,也无需使用双斜杠
\\

string ConnString=@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\dxs.accdb");

string sql="Insert Into tests([Nam],[add],[phone]) Values (@Nam,@add,@phone)";
// Correction 1: Above line is changed ?,?,? to parameter names (names used by your command)

using (OleDbConnection conn = new OleDbConnection(ConnString))
{
   using (OleDbCommand cmd = new OleDbCommand(sql, conn))
   {
      cmd.CommandType = CommandType.Text;
      cmd.Parameters.AddWithValue("@Nam", textBox1.Text);
      cmd.Parameters.AddWithValue("@add", textBox2.Text);
      cmd.Parameters.AddWithValue("@phone",textBox3.Text);
      // Correction 2: your parameter names are changed @"xyz" to "@xyz"

      conn.Open();
      cmd.ExecuteNonQuery();
      MessageBox.Show("entered");
   }
}

insert语句应该类似于dis

    string SqlString = "Insert Into tests( [Nam], [add], [phone]) Values (@Nam, @add, @phone)";


   cmd.CommandType = CommandType.Text;
  cmd.Parameters.AddWithValue("@Nam", textBox1.Text);
  cmd.Parameters.AddWithValue("@add", textBox2.Text);
  cmd.Parameters.AddWithValue("@phone",textBox3.Text);

尝试此操作

Insert语句中的问号而不是有效参数是什么?表示三个文本框字段的标记…我甚至尝试了@,但没有效果。查看此链接,我建议使用ODBC驱动程序而不是OLE-DB。OLE-DB已失效:它可能无法解决问题,但可能会防止将来出现问题。Also、 我建议存储
ExecuteNonQuery
中的返回值,它返回数据库中更改的行数。如果为零,则您知道有问题。尝试过,不工作…输入数据时一直在进行,但刷新表时没有数据可见…不,
@“foo”
表示“逐字字符串”,而
“@foo”“
表示包含T-SQL参数的常规字符串。
@
可以从OP的代码中完全省略,因为不需要逐字字符串(因为没有转义序列),也因为他没有使用t-SQL。我的项目在主项目文件夹和BIN文件夹中都有一个dx数据库。如果我删除后一个,我的问题会得到解决吗?如果您删除
bin
文件夹中的数据库,它将在下一次构建时被重新复制,而不做任何更改。您需要在解决方案资源管理器中选择数据库,并在属性中查找
复制到输出目录
,该目录应设置为
不复制
。然后,您需要连接到项目文件夹中的数据库,这意味着您不能使用
|DataDirectory |
,而是数据库的绝对路径。这种方法解决了我的问题,但出现了一个新问题(我将同一个数据库放在d驱动器中并建立了连接)。如果我想让这段代码在多个系统上工作。行吗?现在数据库不在输出目录中。。我必须手动将数据库添加到其他机器d驱动器吗??或者是否有解决方法??您应该保持数据库的相对路径-这是一个好的做法(对于这种情况)。如果您的应用程序需要一个数据库,您应该将其作为项目的一部分。您应该小心,因为在这种情况下,您的数据库将在每次构建后被复制(替换)。但当你使用你的应用程序时。如果不重建(重新编译),您将一直使用相同的数据库(直到您重建项目!);这似乎是解决办法
| DataDirectory |
指的是输出文件夹中的数据库,而不是项目文件夹中的数据库。@ZevSpitz。我感谢你的反对票。但我无法理解(没有关于)输出文件夹的信息。我没有像你说的那样想,但我准备好思考,如果我得到一些想法,我说不需要投反对票,不应该投反对票,因为这似乎是答案。(否决票不是我的。)但是,你可以编辑它以使用参数,就像在原始问题中一样,避免SQL注入。谢谢@ZevSpitz。我做了一些搜索。使用参数化查询并确定了OP的问题。解决OP的问题不需要您最近的编辑。我认为您第一次告诉OP从连接字符串中删除
| DataDirectory |
时是对的。这个新编辑的代码是否运行?downvote-。