问题: 我正在尝试使用C#中的Oledb接口将日期时间插入到访问数据库中。
黑客攻击解决方案:在不使用command.Properties
的情况下生成插入字符串我可以毫无问题地将文本插入数据库,但在尝试datetime时,我最终会遇到此错误:System.Data.OleDb.OleDbException {“条件表达式中的数据类型不匹配。”}
有几个类似的帖子但是没有可行的解决方案。
这是我的代码:
void TransferData()
{
string instCmd = Get_InsertCommand(0); // hard coded table 0 for testing
Fill_ProductTable_ToInsert();
con.Open();
// It would be nice not to have to separate the date indexes
int[] textIndex = { 0, 1, 2, 3, 4, 7 };
int[] dateIndex = { 5, 6 };
try
{
foreach (DataRow row in DataToStore.Tables[0].Rows)
{
OleDbCommand command = new OleDbCommand();
command.Connection = con;
command.CommandText = instCmd;
foreach(int j in textIndex)
command.Parameters.AddWithValue("@" + j, row[j]);
foreach (int j in dateIndex)
{
// TESTING CODE
///////////////////////////////////////////////////////////////////////////
string input = "#\'" +DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") +"\'#";
command.Parameters.AddWithValue("@" + j, input.ToString());
Program.WriteLine(input.ToString());
///////////////////////////////////////////////////////////////////////////
}
command.ExecuteNonQuery();
}
}
finally
{
con.Close();
}
}
string Get_InsertCommand(int i)
{
string sqlIns = "INSERT INTO " + DataToStore.Tables[0].TableName + " (";
string temp = "VALUES (";
for (int j = 0; j < expected_header[i].Length - 1; j++)
{
sqlIns += expected_header[i][j] + ", ";
temp += "@" + j + ", ";
}
int lastIndex = expected_header[i].Length -1;
sqlIns += expected_header[i][lastIndex] + ") ";
temp += "@" + lastIndex + ")";
sqlIns += temp;
return sqlIns;
}
在标有测试代码的区域内,我尝试了每一个我能想到的日期时间的排列。 我用#和'尝试了每种格式 我试过这些格式:yyyy-MM-dd,yyyyMMdd,yyyy \ MM \ dd,yyyy / MM / dd 我也试过ToOADate() 和ToString(),ToShortDateString()
我还尝试将数据库设置为接受ANSI-92 Sql
我的想法已经不多了。
注意:此代码设置为处理来自多个数据库的多个表,请注意循环...
答案 0 :(得分:4)
正确使用参数,不必担心在查询中连接的日期时间值的格式。 我不明白为什么要将datetime值转换为字符串值?
DateTime theDate = new DateTime(2012,10,16);
var cmd = new OleDbCommand();
cmd.CommandText = "INSERT INTO sometable (column) VALUES (@p_bar)";
cmd.Parameters.Add ("@p_bar", OleDbType.DateTime).Value = theDate;
答案 1 :(得分:0)
我能够通过不使用命令属性来解决此问题。我生成了自己的sql输入并将其设置为cmd.commandText。日期时间输入到数据库的文本是#yyyy-MM-dd#