尝试从一个表中读取数据,然后将其写入另一个表
本文关键字:然后 数据 另一个 读取 一个 | 更新日期: 2023-09-27 18:21:24
我正在尝试将数据从第一个表插入到另一个表中。我将 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;
}
我已经检查了数据库中的所有数据字段是否都是正确的类型,据我所知,它们是正确的。当前项 ID 将插入到数字字段中。其余部分全部插入到短文本字段中。
不知道这是否重要,但购买信息中还有一个自动编号字段。
像这样使用参数化查询:
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;
}
currentItemID
将插入到Number
字段中。
我认为这就是问题所在,因为您尝试用单引号插入它作为'" + currentItemID + "'
.删除它们之间的单引号。
ItemID = '" + itemID + "'
对我来说也很可疑。根据它的名字,这也应该是一些数值。因此,您可能还需要删除这些单引号。
但更重要的是,应始终使用参数化查询。这种字符串串联对SQL注入攻击是开放的。
使用 using
语句自动释放连接、命令和读取器,而不是手动调用Close
或Dispose
方法。
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.
}
}
}