MySQL数据库空问题

时间:2011-11-30 23:12:14

标签: c# mysql

我目前正在从日历中将数据输入数据库,我意识到我输入的任何新条目都是空的。输入的所有数据都与列相同,并且我很困惑这是如何发生的。我输入的值都不为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)
            {

            }
        }

2 个答案:

答案 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块,除非你有充分的理由“消耗”该异常。