oledbcommand ExecuteNonQuery 不会更新
oledbcommand ExecuteNonQuery won't update
我有以下代码,它根据字符串字段和日期执行 select,如果它 returns 有任何内容,它会尝试进行更新。 select returns 东西,但是当我更新变量 "affected" 设置为零时,这可能是因为日期吗?当我检查它时,我的日期变量设置为(英式格式){02/06/2016 13:10:00},因此它确实有一个时间部分。
// DateTime Md, string ht = these are set at this point
var conn = new OleDbConnection();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyPath\MyDb.accdb";
conn.Open();
var cmdSel = conn.CreateCommand();
cmdSel.CommandText = @"SELECT * FROM MyTable WHERE Md = @MD AND HT=@HT";
cmdSel.Parameters.AddWithValue("@MD", Md);
cmdSel.Parameters.AddWithValue("@HT", ht);
var da = new OleDbDataAdapter(cmdSel);
var ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
var cmd = conn.CreateCommand();
cmd.CommandText = @"UPDATE MyTable SET HS=@HS WHERE Md = @MD AND HT=@HT";
cmd.Parameters.AddWithValue("@MD", Md);
cmd.Parameters.AddWithValue("@HT", ht);
cmd.Parameters.AddWithValue("@HS", hs);
var affected = cmd.ExecuteNonQuery();
}
Access/OleDB 不使用命名参数,它们只是位置占位符。因此,您必须按照 SQL 中列出的确切顺序提供参数值。您的代码与其他推荐的修复程序类似:
string sql = @"UPDATE MyTable SET HS=@HS WHERE Md = @MD AND HT=@HT";
using (OleDbConnection dbcon = new OleDbConnection(AceConnStr))
{
// other code
using (OleDbCommand cmd = new OleDbCommand(sql, dbcon))
{
// add in the same order as in SQL
// I have no idea that these are
cmd.Parameters.Add("@HS", OleDbType.VarChar).Value = Hs;
cmd.Parameters.Add("@MD", OleDbType.Date).Value = Md;
cmd.Parameters.Add("@HT", OleDbType.Integer).Value = Ht;
int rows = cmd.ExecuteNonQuery();
} // closes and disposes of connection and command objects
}
不处理应该看到的东西的结果 用户 运行 试图在循环中手动插入资源不足。
您也不需要创建 DataAdapter
(或 DataSet
)来填充 table',您可以使用 DataReader
来做同样的事情.
myDT.Load(cmd.ExecuteReader());
我有以下代码,它根据字符串字段和日期执行 select,如果它 returns 有任何内容,它会尝试进行更新。 select returns 东西,但是当我更新变量 "affected" 设置为零时,这可能是因为日期吗?当我检查它时,我的日期变量设置为(英式格式){02/06/2016 13:10:00},因此它确实有一个时间部分。
// DateTime Md, string ht = these are set at this point
var conn = new OleDbConnection();
conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyPath\MyDb.accdb";
conn.Open();
var cmdSel = conn.CreateCommand();
cmdSel.CommandText = @"SELECT * FROM MyTable WHERE Md = @MD AND HT=@HT";
cmdSel.Parameters.AddWithValue("@MD", Md);
cmdSel.Parameters.AddWithValue("@HT", ht);
var da = new OleDbDataAdapter(cmdSel);
var ds = new DataSet();
da.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
var cmd = conn.CreateCommand();
cmd.CommandText = @"UPDATE MyTable SET HS=@HS WHERE Md = @MD AND HT=@HT";
cmd.Parameters.AddWithValue("@MD", Md);
cmd.Parameters.AddWithValue("@HT", ht);
cmd.Parameters.AddWithValue("@HS", hs);
var affected = cmd.ExecuteNonQuery();
}
Access/OleDB 不使用命名参数,它们只是位置占位符。因此,您必须按照 SQL 中列出的确切顺序提供参数值。您的代码与其他推荐的修复程序类似:
string sql = @"UPDATE MyTable SET HS=@HS WHERE Md = @MD AND HT=@HT";
using (OleDbConnection dbcon = new OleDbConnection(AceConnStr))
{
// other code
using (OleDbCommand cmd = new OleDbCommand(sql, dbcon))
{
// add in the same order as in SQL
// I have no idea that these are
cmd.Parameters.Add("@HS", OleDbType.VarChar).Value = Hs;
cmd.Parameters.Add("@MD", OleDbType.Date).Value = Md;
cmd.Parameters.Add("@HT", OleDbType.Integer).Value = Ht;
int rows = cmd.ExecuteNonQuery();
} // closes and disposes of connection and command objects
}
不处理应该看到的东西的结果
您也不需要创建 DataAdapter
(或 DataSet
)来填充 table',您可以使用 DataReader
来做同样的事情.
myDT.Load(cmd.ExecuteReader());