尝试从一个表中读取数据,然后将其写入另一个表

时间:2015-11-11 08:44:21

标签: c# web-services ms-access

我尝试将数据插入到第一个表中的另一个表中。我将2个东西从网站传递给[WebMethod]。

[WebMethod]
public string purchaseInfo(int itemID, string logedInEmail)

当我运行时,会抛出一个异常

  

“条件表达式中的数据类型不匹配”。

 try
       {
           OleDbConnection conn = new OleDbConnection(connString);
           conn.Open();

           OleDbCommand cmd = conn.CreateCommand();
           cmd.CommandText = "SELECT ItemID, itemName, description, price FROM ItemInfo WHERE (ItemID = '" + itemID + "')"; //ItemID is a AutoNumber field.
           OleDbDataReader reader = cmd.ExecuteReader();

           while (reader.Read()) // Reading the data selected
           {
               int currentItemID = (int)reader["ItemID"];                   
               string currentItemName = (string)reader["itemName"];
               string currentdescription = (string)reader["description"];
               string currentPrice = (string)reader["price"];

               cmd.CommandText = @"INSERT INTO PurchaseInfo (itemID, buyerIDEmail, itemName, description, price)
                                 VALUES ('" + currentItemID + "', '" + logedInEmail + "', '" + currentItemName + "', '" + currentdescription + "', '" + currentPrice + "')";
               cmd.ExecuteNonQuery();                   
           }

           conn.Close();
           return "Successful";

       }
       catch (Exception ex)
       {
           return ex.Message;
       } 

我已检查数据库中的所有数据字段是否都是正确的类型,据我所知。 currentItemID被插入Number字段。 其余全部插入短文字段。

不知道是否重要但在PurchaseInfo中还有一个自动编号字段。

2 个答案:

答案 0 :(得分:0)

  

currentItemID已插入Number字段。

我认为这是问题所在,因为您尝试使用单引号作为'" + currentItemID + "'插入它。删除它们之间的单引号。

ItemID = '" + itemID + "'对我来说也很可疑。根据它的名称,这也应该是一些数值。因此,您可能也需要删除这些单引号。

但更重要的是,您应该始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。

使用using statement自动处理您的连接,命令和阅读器,而不是手动调用CloseDispose方法。

using(var connection = new OleDbConnection(connString))
using(var command = connection.CreateCommand())
{
      // Set your CommandText property.
      // Add parameters with `Add` method
      using(var reader = cmd.ExecuteReader())
      {
          while (reader.Read())
          {
               // Get your values.
               // Clear your parameters with `Parameters.Clear()` method.
               // Add new parameters to `cmd`
               // Execute your query.
          }
      }
}

答案 1 :(得分:0)

使用参数化查询,如下所示:

try
{
   OleDbConnection conn = new OleDbConnection(connString);
   conn.Open();

   OleDbCommand cmd = conn.CreateCommand();
   cmd.CommandText = "SELECT ItemID, itemName, description, price FROM ItemInfo WHERE (ItemID = @itemId)";
   cmd.Parameters.Add(new OleDbParameter("@itemId", itemId)
   OleDbDataReader reader = cmd.ExecuteReader();

   while (reader.Read()) // Reading the data selected
   {
       int currentItemID = (int)reader["ItemID"];                   
       string currentItemName = (string)reader["itemName"];
       string currentDescription = (string)reader["description"];
       string currentPrice = (string)reader["price"];

       cmd.CommandText = @"INSERT INTO PurchaseInfo (itemID, buyerIDEmail, itemName, description, price)
                         VALUES (@currentItemId, @loggedInEmail, @currentItemName, @currentDescription,@currentPrice)";
       cmd.Parameters.Add(new OleDbParameter("@currentItemId", currentItemId);
       cmd.Parameters.Add(new OleDbParameter("@loggedInEmail", loggedInEmail);
       cmd.Parameters.Add(new OleDbParameter("@currentItemName", currentItemName);
       cmd.Parameters.Add(new OleDbParameter("@currentDescription", currentDescription);
       cmd.Parameters.Add(new OleDbParameter("@currentPrice", currentPrice);
       cmd.ExecuteNonQuery();                   
   }

   conn.Close();
   return "Successful";

}
catch (Exception ex)
{
    return ex.Message;
}