Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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
使用十进制参数的数据类型不匹配-OleDb,C#,Access_C#_Ms Access_Parameterized_Oledbdataadapter - Fatal编程技术网

使用十进制参数的数据类型不匹配-OleDb,C#,Access

使用十进制参数的数据类型不匹配-OleDb,C#,Access,c#,ms-access,parameterized,oledbdataadapter,C#,Ms Access,Parameterized,Oledbdataadapter,好的,我正在尝试将程序中更新的私有成员发送到access数据库。但是,每当我运行程序并按下保存按钮时,就会出现“条件表达式中的数据类型不匹配”异常 下面是我正在使用的代码片段。它正在da.Update命令中引发异常。所以我知道这与我的更新命令或参数有关。 我还注释掉了重复的部分,因为我一直试图缩小问题的范围 OLEDB连接conn=新的OLEDB连接(ConnString) 如果去掉注释部分,本质上缩小到这一点: OleDbConnection conn = new OleDbConnectio

好的,我正在尝试将程序中更新的私有成员发送到access数据库。但是,每当我运行程序并按下保存按钮时,就会出现“条件表达式中的数据类型不匹配”异常

下面是我正在使用的代码片段。它正在da.Update命令中引发异常。所以我知道这与我的更新命令或参数有关。 我还注释掉了重复的部分,因为我一直试图缩小问题的范围

OLEDB连接conn=新的OLEDB连接(ConnString)

如果去掉注释部分,本质上缩小到这一点:

OleDbConnection conn = new OleDbConnection(ConnString);

        string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";

        string update = @" UPDATE Account SET
                        Cash = '@Cash'";
        try{
            OleDbDataAdapter da = new OleDbDataAdapter();

            da.SelectCommand = new OleDbCommand(sql, conn);

            AccountDatabaseDataSet ds = new AccountDatabaseDataSet();

            da.Fill(ds, "Account");

            DataTable dt = ds.Tables["Account"];

            dt.Rows[0][1] = cash;

            OleDbCommand cmd = new OleDbCommand(update, conn);

            cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");

            da.UpdateCommand = cmd;
            da.Update(ds, "Account");
         }
所以,基本上我有一个“Account”表,我想将第二列[1]设置为decimal类型的私有成员变量“cash”。然后我为“@Cash”参数设置参数,其中OleDbType是一个十进制,大小是18,access数据库中的列是“Cash”。最后,我用这个值更新“Account”表

现在我已经尝试将oledbtype中的.Decimal更改为列表中所有可能的类型,但它似乎从来都不起作用,甚至有些异常将其声明为“无法转换为DateTime的Decimal类型”,例如。所以我相信OLEDB类型不是问题所在。我还尝试过修改参数中的大小,但也没有成功


我已经尽我所能解释了这一点,但如果还有其他有助于解决此问题的方法,我会提供。

如果您需要更新数据库上的行,请尝试下面的方法

using (OleDbConnection conn = new OleDbConnection(ConnString))
 {
       conn.Open();
       using (var cmd = conn.CreateCommand())
       {
            cmd.CommandText = "UPDATE Account SET Cash=? WHERE AccountID =?";
            cmd.Parameters.Add("@p1", OleDbType.Decimal).Value = 3.1416;
            cmd.Parameters.Add("@p2", OleDbType.Integer).Value = accountName;
            cmd.ExecuteNonQuery();
       }
 }
  • 使用参数,否则您的查询将被sql注入攻击打开
  • OLE DB.NET Framework数据提供程序使用带问号(?)的位置参数,而不是命名参数

    • 您说它正在抛出异常。您是否尝试捕获异常并更详细地检查它?有时,异常将具有InnerException属性,该属性可以包含复杂对象(如OleDb)引发的错误的更多详细信息。

      以下是解决我的更新难题的代码,供需要帮助的人参考。这是在Visual Studio 2012中使用MS Access的数据集:

      public void UpdateValues(string accountName)
          {
              OleDbConnection conn = new OleDbConnection(ConnString);
      
              string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";
      
              string update = "UPDATE Account SET Cash = ?, PaidInCapital = ?, TotalRetainedEarnings = ?, StockholdersEquity = ?, " +
                              "CommonStock = ?, PreferredStock = ?, TreasuryStock = ?, CashDividends = ?, StockDividends = ?, " +
                              "TotalNumberPreferred = ?, PreferredMarketPrice = ?, PreferredPar = ?, Cumulative = ?, TotalNumberCommon = ?, " +
                              "CommonMarketPrice = ?, CommonPar = ?, NumberTransactTreasuryStock = ?, AvgPriceTreasury = ? WHERE AccountID = '" + accountName + "'";
              try
              {
                  OleDbDataAdapter da = new OleDbDataAdapter();
      
                  da.SelectCommand = new OleDbCommand(sql, conn);
      
                  AccountDatabaseDataSet ds = new AccountDatabaseDataSet();
      
                  da.Fill(ds, "Account");
      
                  DataTable dt = ds.Tables["Account"];
      
                  dt.Rows[0][1] = cash;
                  dt.Rows[0][2] = paidInCapital;
                  dt.Rows[0][3] = totalRetainedEarnings;
                  dt.Rows[0][4] = stockholdersEquity;
                  dt.Rows[0][5] = commonStock;
                  dt.Rows[0][6] = preferredStock;
                  dt.Rows[0][7] = treasuryStock;
                  dt.Rows[0][8] = cashDividends;
                  dt.Rows[0][9] = stockDividends;
                  dt.Rows[0][10] = totalNumberPreferred;
                  dt.Rows[0][11] = preferredMarketPrice;
                  dt.Rows[0][12] = preferredPar;
                  dt.Rows[0][13] = preferredRate;
                  dt.Rows[0][14] = cumulative;
                  dt.Rows[0][15] = totalNumberCommon;
                  dt.Rows[0][16] = commonMarketPrice;
                  dt.Rows[0][17] = commonPar;
                  dt.Rows[0][18] = numberTransactTreasury;
                  dt.Rows[0][19] = avgPriceTreasury;
      
                  OleDbCommand cmd = new OleDbCommand(update, conn);
      
                  cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");
                  cmd.Parameters.Add("@PaidInCapital", OleDbType.Decimal, 18, "PaidInCapital");
                  cmd.Parameters.Add("@TotalRetainedEarnings", OleDbType.Decimal, 18, "TotalRetainedEarnings");
                  cmd.Parameters.Add("@StockholdersEquity", OleDbType.Decimal, 18, "StockholdersEquity");
                  cmd.Parameters.Add("@CommonStock", OleDbType.Decimal, 18, "CommonStock");
                  cmd.Parameters.Add("@PreferredStock", OleDbType.Decimal, 18, "PreferredStock");
                  cmd.Parameters.Add("@TreasuryStock", OleDbType.Decimal, 18, "TreasuryStock");
                  cmd.Parameters.Add("@CashDividends", OleDbType.Decimal, 18, "CashDividends");
                  cmd.Parameters.Add("@StockDividends", OleDbType.Decimal, 18, "StockDividends");
                  cmd.Parameters.Add("@TotalNumberPreferred", OleDbType.Integer, 16, "TotalNumberPreferred");
                  cmd.Parameters.Add("@PreferredMarketPrice", OleDbType.Decimal, 10, "PreferredMarketPrice");
                  cmd.Parameters.Add("@PreferredPar", OleDbType.Decimal, 10, "PreferredPar");
                  cmd.Parameters.Add("@PreferredRate", OleDbType.Decimal, 5, "PreferredRate");
                  cmd.Parameters.Add("@Cumulative", OleDbType.Boolean, 2, "Cumulative");
                  cmd.Parameters.Add("@TotalNumberCommon", OleDbType.Integer, 16, "TotalNumberCommon");
                  cmd.Parameters.Add("@CommonMarketPrice", OleDbType.Decimal, 10, "CommonMarketPrice");
                  cmd.Parameters.Add("@CommonPar", OleDbType.Decimal, 10, "CommonPar");
                  cmd.Parameters.Add("@NumberTransactTreasuryStock", OleDbType.Integer, 16, "NumberTransactTreasuryStock");
                  cmd.Parameters.Add("@AvgPriceTreasury", OleDbType.Decimal, 10, "AvgPriceTreasury");
      
                  da.UpdateCommand = cmd;
                  da.Update(ds, "Account");
              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.Message + ex.StackTrace, "Exception Details");
              }
              finally
              {
                  conn.Close();
              }
          }
      

      为什么人们给OLEDB参数起名字?当CommandType设置为Text时,OLE DB.NET提供程序不支持将参数传递给SQL语句或OleDbCommand调用的存储过程的命名参数。在这种情况下,必须使用问号(?)占位符。但不管文档如何操作,
      UPDATE Account SET Cash='@Cash'
      是错误的:您不需要在参数占位符周围放置
      '
      。@ta.speot.很显然可能,我只是去掉了“”,就像您在第二条评论中所说的那样,在更新中添加了一个where子句,我就可以让它工作了。虽然它非常详细,但我相信它应该正常工作。OLE DB.NET Framework数据提供程序使用带问号(?)的位置参数,而不是命名参数。但你还是说出了你的名字。因此,考虑使用< <代码> >语句He..t.Seopt.使用块来添加,但是我们可以在声明时命名参数。Damith好的,所以我做了更改,现在我的代码看起来是这样的:
      使用(OleDbConnection conn=new OleDbConnection(ConnString)){try{conn.Open();使用(var cmd=conn.CreateCommand()){cmd.CommandText=“UPDATE Account SET Cash=?,PaidInCapital=?,其中AccountID=?”;cmd.Parameters.Add(@Cash),OleDbType.Decimal).Value=cash;cmd.Parameters.Add(“@PaidInCapital”,OleDbType.Decimal)。Value=PaidInCapital;cmd.Parameters.Add(“@AccountId”,OleDbType.VarChar)。Value=accountName;cmd.ExecuteNonQuery();}
      但它仍然不会更新数据库中的任何内容任何异常?您在解决方案中放置access文件的位置?@Damith None,access文件与我的源代码位于同一文件夹中。我知道我可以访问数据库,因为我从一开始就填充了一个列表。是的,它说明如下:条件表达式中的数据类型不匹配。at System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpda tedEventArgs RowUpdateEvent、BatchCommandInfo[]batchCommands、Inter32 commandCount)等。
      public void UpdateValues(string accountName)
          {
              OleDbConnection conn = new OleDbConnection(ConnString);
      
              string sql = @" SELECT * FROM Account where AccountID = '" + accountName + @"'";
      
              string update = "UPDATE Account SET Cash = ?, PaidInCapital = ?, TotalRetainedEarnings = ?, StockholdersEquity = ?, " +
                              "CommonStock = ?, PreferredStock = ?, TreasuryStock = ?, CashDividends = ?, StockDividends = ?, " +
                              "TotalNumberPreferred = ?, PreferredMarketPrice = ?, PreferredPar = ?, Cumulative = ?, TotalNumberCommon = ?, " +
                              "CommonMarketPrice = ?, CommonPar = ?, NumberTransactTreasuryStock = ?, AvgPriceTreasury = ? WHERE AccountID = '" + accountName + "'";
              try
              {
                  OleDbDataAdapter da = new OleDbDataAdapter();
      
                  da.SelectCommand = new OleDbCommand(sql, conn);
      
                  AccountDatabaseDataSet ds = new AccountDatabaseDataSet();
      
                  da.Fill(ds, "Account");
      
                  DataTable dt = ds.Tables["Account"];
      
                  dt.Rows[0][1] = cash;
                  dt.Rows[0][2] = paidInCapital;
                  dt.Rows[0][3] = totalRetainedEarnings;
                  dt.Rows[0][4] = stockholdersEquity;
                  dt.Rows[0][5] = commonStock;
                  dt.Rows[0][6] = preferredStock;
                  dt.Rows[0][7] = treasuryStock;
                  dt.Rows[0][8] = cashDividends;
                  dt.Rows[0][9] = stockDividends;
                  dt.Rows[0][10] = totalNumberPreferred;
                  dt.Rows[0][11] = preferredMarketPrice;
                  dt.Rows[0][12] = preferredPar;
                  dt.Rows[0][13] = preferredRate;
                  dt.Rows[0][14] = cumulative;
                  dt.Rows[0][15] = totalNumberCommon;
                  dt.Rows[0][16] = commonMarketPrice;
                  dt.Rows[0][17] = commonPar;
                  dt.Rows[0][18] = numberTransactTreasury;
                  dt.Rows[0][19] = avgPriceTreasury;
      
                  OleDbCommand cmd = new OleDbCommand(update, conn);
      
                  cmd.Parameters.Add("@Cash", OleDbType.Decimal, 18, "Cash");
                  cmd.Parameters.Add("@PaidInCapital", OleDbType.Decimal, 18, "PaidInCapital");
                  cmd.Parameters.Add("@TotalRetainedEarnings", OleDbType.Decimal, 18, "TotalRetainedEarnings");
                  cmd.Parameters.Add("@StockholdersEquity", OleDbType.Decimal, 18, "StockholdersEquity");
                  cmd.Parameters.Add("@CommonStock", OleDbType.Decimal, 18, "CommonStock");
                  cmd.Parameters.Add("@PreferredStock", OleDbType.Decimal, 18, "PreferredStock");
                  cmd.Parameters.Add("@TreasuryStock", OleDbType.Decimal, 18, "TreasuryStock");
                  cmd.Parameters.Add("@CashDividends", OleDbType.Decimal, 18, "CashDividends");
                  cmd.Parameters.Add("@StockDividends", OleDbType.Decimal, 18, "StockDividends");
                  cmd.Parameters.Add("@TotalNumberPreferred", OleDbType.Integer, 16, "TotalNumberPreferred");
                  cmd.Parameters.Add("@PreferredMarketPrice", OleDbType.Decimal, 10, "PreferredMarketPrice");
                  cmd.Parameters.Add("@PreferredPar", OleDbType.Decimal, 10, "PreferredPar");
                  cmd.Parameters.Add("@PreferredRate", OleDbType.Decimal, 5, "PreferredRate");
                  cmd.Parameters.Add("@Cumulative", OleDbType.Boolean, 2, "Cumulative");
                  cmd.Parameters.Add("@TotalNumberCommon", OleDbType.Integer, 16, "TotalNumberCommon");
                  cmd.Parameters.Add("@CommonMarketPrice", OleDbType.Decimal, 10, "CommonMarketPrice");
                  cmd.Parameters.Add("@CommonPar", OleDbType.Decimal, 10, "CommonPar");
                  cmd.Parameters.Add("@NumberTransactTreasuryStock", OleDbType.Integer, 16, "NumberTransactTreasuryStock");
                  cmd.Parameters.Add("@AvgPriceTreasury", OleDbType.Decimal, 10, "AvgPriceTreasury");
      
                  da.UpdateCommand = cmd;
                  da.Update(ds, "Account");
              }
              catch (Exception ex)
              {
                  MessageBox.Show(ex.Message + ex.StackTrace, "Exception Details");
              }
              finally
              {
                  conn.Close();
              }
          }