我目前正在从日历中将数据输入数据库,我意识到我输入的任何新条目都是空的。输入的所有数据都与列相同,并且我很困惑这是如何发生的。我输入的值都不为null或为空。我已经调试并观察了值以了解它。
public static void insertEvent(string date, string title, string eventLocation, string detailsShort, string detailsLong, DateTime startTime, DateTime endTime, DateTime entered, string enteredBy)
{
try
{
string queryString = "INSERT INTO cor(cal_date,event_title,event_location,details_short,details_long,time_start,time_end,entered,entered_by) VALUES (cal_date=cal_date, event_title=event_title, event_location=event_location, details_short=details_short, details_long=details_long,time_start=time_start, time_end=time_end, entered=entered, entered_by=entered_by)";
OdbcConnection conn = new OdbcConnection(MyConString);
conn.Open();
OdbcCommand command = new OdbcCommand(queryString, conn);
command.Parameters.Add("cal_date", OdbcType.DateTime, 30).Value = date;
command.Parameters.Add("event_title", OdbcType.VarChar, 100).Value = title;
command.Parameters.Add("event_location", OdbcType.VarChar, 100).Value = eventLocation;
command.Parameters.Add("details_short", OdbcType.VarChar, 300).Value = detailsShort;
command.Parameters.Add("details_long", OdbcType.VarChar, 300).Value = detailsLong;
command.Parameters.Add("time_start", OdbcType.DateTime, 30).Value = startTime;
command.Parameters.Add("time_end", OdbcType.DateTime, 30).Value = endTime;
command.Parameters.Add("entered", OdbcType.DateTime, 30).Value = entered;
command.Parameters.Add("entered_by", OdbcType.VarChar, 30).Value = enteredBy;
command.ExecuteNonQuery();
conn.Close();
}
catch (Exception)
{
}
}
答案 0 :(得分:1)
INSERT INTO cor(cal_date, ...) VALUES (cal_date=cal_date, ...);
问题是表达式cal_date=cal_date
(以及每列的类似表达式)。
当您插入新行时,任何列都没有值。因此对列的任何引用都是NULL。表达式NULL = NULL也会产生NULL。所以你没有插入值,你要为所有列插入NULL表达式。
如果将表达式更改为cal_date=@cal_date
,则无法解决问题。您将cal_date
的当前值(为NULL)与参数@cal_date
的值进行比较。像NULL=<anything>
这样的表达式总是产生NULL。
你应该只使用参数,而不是表达式:
INSERT INTO cor(cal_date, event_tile, ...) VALUES (@cal_date, @event_title, ...);
更新:阅读“Pass Parameters to OdbcCommand”中的示例代码。该示例显示使用?
占位符作为@ ZombieHunter的答案建议 - 不是命名参数占位符。但是,在调用Parameters.Add()
时,不知何故使用带有@
前缀的命名参数。去图。
nonqueryCommand.CommandText = "INSERT INTO MyTable VALUES (?, ?)";
nonqueryCommand.Parameters.Add("@MyName", OdbcType.VarChar, 30);
nonqueryCommand.Parameters.Add("@MyNumber", OdbcType.Int);
答案 1 :(得分:0)
我不确定ODBC是否支持命名参数和常规SQL语句。到目前为止我看到的ODBC语句使用“?
”作为参数的占位符。
某些DBMS允许应用程序指定a的参数 存储过程按名称而不是过程调用中的位置。 这些参数称为命名参数。 ODBC支持使用 命名参数。在ODBC中,命名参数仅在调用时使用 存储过程和不能在其他SQL语句中使用 http://msdn.microsoft.com/en-us/library/windows/desktop/ms715435%28v=VS.85%29.aspx
为什么不使用原生MySQL provider for .NET?这会更快,并且可能支持更多MySQL特定功能。
另外,我强烈建议不要使用空的catch
块,除非你有充分的理由“消耗”该异常。