C# MySQL数据库空问题
我目前正在从日历向数据库输入数据,我意识到我输入的任何新条目都是空的。输入的所有数据都与列的数据类型相同,我不知道这是如何发生的。我输入的值都不是null或空的。我已经调试并观察了这些值以了解这一点C# MySQL数据库空问题,c#,mysql,C#,Mysql,我目前正在从日历向数据库输入数据,我意识到我输入的任何新条目都是空的。输入的所有数据都与列的数据类型相同,我不知道这是如何发生的。我输入的值都不是null或空的。我已经调试并观察了这些值以了解这一点 public static void insertEvent(string date, string title, string eventLocation, string detailsShort, string detailsLong, DateTime startTime, DateTime
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)
{
}
}
我不确定ODBC是否支持命名参数和常规SQL语句。到目前为止,我看到的ODBC语句使用“
?
”作为参数的占位符
某些DBMS允许应用程序指定数据库的参数
存储过程在过程调用中按名称而不是按位置。
此类参数称为命名参数。ODBC支持使用
命名参数。在ODBC中,命名参数仅在调用
存储过程和不能用于其他SQL语句你为什么不用本地人?这将更快,并且可能支持更多特定于MySQL的功能
另外,我强烈建议不要使用空的
catch
块,除非您有充分的理由“使用”该异常。我不确定ODBC是否支持命名参数和常规SQL语句。到目前为止,我看到的ODBC语句使用“?
”作为参数的占位符
INSERT INTO cor(cal_date, ...) VALUES (cal_date=cal_date, ...);
某些DBMS允许应用程序指定数据库的参数
存储过程在过程调用中按名称而不是按位置。
此类参数称为命名参数。ODBC支持使用
命名参数。在ODBC中,命名参数仅在调用
存储过程和不能用于其他SQL语句你为什么不用本地人?这将更快,并且可能支持更多特定于MySQL的功能 另外,我强烈建议不要使用空的
catch
块,除非您有充分的理由“使用”该异常
INSERT INTO cor(cal_date, ...) VALUES (cal_date=cal_date, ...);
问题在于表达式cal_date=cal_date
(以及每个列的类似表达式)
插入新行时,任何列都没有值。因此,对该列的任何引用都是空的。表达式NULL=NULL也会产生NULL。因此,您不是在插入值,而是在为所有列插入空表达式
如果将表达式更改为cal_date=@cal_date
,则不会解决问题。您正在将cal\u date
的当前值(为空)与参数@cal\u date
的值进行比较。类似于NULL=“”的表达式。该示例显示使用@ZombieHunter的答案所建议的?
占位符——而不是命名参数占位符。但是,在调用Parameters.Add()
时,不知何故使用了前缀为@
的命名参数。如图所示
nonqueryCommand.CommandText = "INSERT INTO MyTable VALUES (?, ?)";
nonqueryCommand.Parameters.Add("@MyName", OdbcType.VarChar, 30);
nonqueryCommand.Parameters.Add("@MyNumber", OdbcType.Int);
问题在于表达式cal_date=cal_date
(以及每个列的类似表达式)
插入新行时,任何列都没有值。因此,对该列的任何引用都为NULL。表达式NULL=NULL也会生成NULL。因此,您没有插入值,而是为所有列插入NULL表达式
如果将表达式更改为cal\u date=@cal\u date
,则无法解决问题。您正在将cal\u date
的当前值(为NULL)与参数@cal\u date
的值进行比较。类似于NULL=”的表达式。该示例显示了使用@ZombieHunter的答案建议的?
占位符——而不是命名参数占位符。但是,在调用Parameters.Add()
时,人们会以某种方式使用前缀为@
的命名参数。算了吧
nonqueryCommand.CommandText = "INSERT INTO MyTable VALUES (?, ?)";
nonqueryCommand.Parameters.Add("@MyName", OdbcType.VarChar, 30);
nonqueryCommand.Parameters.Add("@MyNumber", OdbcType.Int);
可能需要编辑出您的根密码LOL。对于严格的数据类型语言,我应该捕捉到+1。您是否尝试输出任何异常消息?查询中没有异常。数据库中有什么我可以看一下的吗?@MasterP可能想更改您的根密码;任何人都可以查看问题的编辑历史记录,但仍然可以看到。可能需要编辑您的根密码LOL。对于严格的数据类型语言,我应该捕捉到+1。您是否尝试输出任何异常消息?查询中没有异常。数据库中有什么我可以看一下的吗?@MasterP可能想更改您的根密码;任何人都可以查看问题的编辑历史记录,但仍然可以看到它。空捕获只是为了调试。我所有的查询都使用此连接器,而且我已经被踩了很长时间,我不想在不找出答案的情况下放弃。哈哈,好吧。因此,只需使用´?´作为参数占位符,并使用command.parameters.AddWithValue()以正确的顺序添加参数。空捕获仅用于调试。我所有的查询都使用此连接器,我已经被踩得太久了,我不想在不弄清楚答案的情况下放弃。哈哈,好吧。因此,只需使用´?´作为参数占位符,并使用command.parameters.AddWithValue()按正确顺序添加参数。添加@符号以区分变量仍然会导致空值。添加@符号以区分变量仍然会导致空值。