【问题标题】:OleDBException was unhandled NO value given for one or more parametersOleDBException 未处理 没有为一个或多个参数提供值
【发布时间】:2012-05-15 19:01:40
【问题描述】:

我正在尝试从 C# 更新 access 数据库中的表。

它是一个.mdb类型的数据库。

这是我正在使用的连接字符串。 public MainWindow() {

InitializeComponent();

OleDbConnection cn= new OleDbConnection();}
cn.ConnectionString=@"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=" 
    + "C:\Users\Angela\Documents\Visual Studio 2010\Projects\Havnefoged11.mdb;" 
    + "User Id=;Password=;";

cn.Open();

Application.Current.Properties["DBConnection"] = cn;

文件位于正确的文件夹 C:\Users\Angela\Documents\Visual Studio 2010\Projects

 private void button1_Click_1(object sender, RoutedEventArgs e)
    {

 OleDbConnection conn =             

 (OleDbConnection)Application.Current.Properties["DBConnection"];
 //Below are the values i want to put into the database 
 String dybde = Dybde.Text;
 String bredde = Bredde.Text;
 String plads = PladsNummer.Text;

String StrSQL = 
    "INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES (´´"+ plads
        + "´,´" 
        + bredde
        + "´," 
        + dybde+");";

  OleDbCommand InsertCommand = new OleDbCommand(StrSQL, conn);

   InsertCommand.ExecuteNonQuery();
    }

然后我得到错误 OleDBException is unhandled NO value given for a or more parameters

我已经进去把数据库中的所有字段都改成了文本 我检查了它们是否正确的字段名称。 ldb 文件在我初始化程序时出现。 但是当我按下按钮时,我得到了错误。

有什么想法吗?

附言 我已经包含了

  using System.Data;
   using System.Data.OleDb;

【问题讨论】:

  • 请以可读的方式格式化您的代码..!
  • 你有一个 SQL 注入漏洞。
  • dybde的价值是什么?我敢打赌它是一个空字符串,或者为空。此外,您在第一个值之前还有一个额外的单引号。最后,通过连接用户输入来构建 SQL 字符串是一种可怕的做法。你向 SQL 注入敞开心扉。您应该改用参数化查询。 (如果你用谷歌搜索“Parameterized Queries .NET”,会有大量信息)
  • SQL 注入:Exploits of a Mom

标签: c# ms-access oledb


【解决方案1】:

您的StrSQL 看起来有点可疑。您能否在执行之前显示该字符串的值?我猜撇号和/或引号有点混淆了。

String StrSQL = "INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES (´´"+ plads +"´,´"+bredde+"´,"+dybde+");";

作为在黑暗中的刺,试试这个吧:

string StrSQL = string.Format("INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES ('{0}', '{1}', '{2}')", plads, bredde, dybde);

【讨论】:

  • 嗨 Jason,我现在已经尝试过了,但收到错误 INSERT INTO 语句包含以下未知字段名称:“Plads_nummer”。确保您已正确键入名称,然后重试该操作。所以我也会检查一下
  • 我尝试了 jason 所说的,但没有奏效,但给了我错误 INSERT INTO 语句包含以下未知字段名称:'Plads_nummer'。然后我进入文件并将 Plads_nummer 更改为 pladsnummer (并在代码中)这允许代码工作(我还按照建议设置了撇号。奇怪的是我没有得到与 jasons 相同的错误方法因为原因是一样的。谢谢大家的帮助
【解决方案2】:

正如其他人指出的那样,您对 SQL 注入攻击持开放态度。你应该使用参数。它可能失败的原因是您插入的字符串的内容可能包含“?”和 ”?”被暗示为“我在这里期待一个参数”,这就是让它窒息的原因。

尝试更改为

String StrSQL = "INSERT INTO Bådpladser (Plads_nummer, Bredde, Dybde ) VALUES ( ?, ?, ? )";
OleDbCommand InsertCommand = new OleDbCommand(StrSQL, conn )
InsertCommand.Parameters.AddWithValue( "yourFirstParm", plads );
InsertCommand.Parameters.AddWithValue( "yourSecondParm", bredde );
InsertCommand.Parameters.AddWithValue( "yourThirdParm", dybde );

那么,执行它,但是注意:参数必须按照与“?”相同的顺序添加。占位符。

另外,您的后端可能支持命名参数而不是“?”价值观...如果是这样,您可能需要调整到类似的东西

String StrSQL = "INSERT INTO Bådpladser (Plads_nummer, Bredde, Dybde ) "
      + "VALUES ( @parmPlads, @parmBredde, @parmDybde )";
OleDbCommand InsertCommand = new OleDbCommand(StrSQL, conn )
InsertCommand.Parameters.AddWithValue( "@parmPlads", plads );
InsertCommand.Parameters.AddWithValue( "@parmBredde", bredde );
InsertCommand.Parameters.AddWithValue( "@parmDybde", dybde );

【讨论】:

  • 嗨 Drapp 我已经在回复 Jason 时说明了问题所在。干杯
  • @DavidDrennan,我认为你仍然对 SQL 注入持开放态度。他所做的所有选择就是对字符串进行预花式格式化,并将您的值分别放入 {0}、{1}、{2} 的位置。如果你有一个“?”在你的值的内容中,它可能仍然会导致问题......或打开sql注入......但你的选择。
【解决方案3】:

我注意到了这一点:

String StrSQL = "INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES (´´"+ 
                    plads +"´,´"+bredde+"´,"+dybde+");";

我看到您在标语前面有两个撇号。你可能只需要一个。如果您必须将它们作为双撇号转义,那么您可能会在每个逗号之后的 a 之前加倍。

【讨论】:

  • @PeterRitchie true...但在 dybde 之前也没有,所以我认为它不是字符串。
  • 再次嗨,我试图弄乱撇号,这里是现在的样子(问题仍然存在) String StrSQL = "INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES ('"+ plads +"','"+bredde+"','"+dybde+"')";撇号在引号内
  • 当您尝试不使用连接的插入时会发生什么(例如,“INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES ('PLADS_NUM','BREDDE', 'Dtybde')”或者“ INSERT INTO Bådpladser (Plads_nummer,Bredde,Dybde) VALUES (1234,5678, 9012)" 如果它们是数值)
  • 大家好,现在已排序,请参阅 Jasons 帖子下
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多