【问题标题】:System.Data.SQLite parameter issueSystem.Data.SQLite 参数问题
【发布时间】:2010-10-19 13:36:25
【问题描述】:

我有以下代码:

try
{
    //Create connection
    SQLiteConnection conn = DBConnection.OpenDB();

    //Verify user input, normally you give dbType a size, but Text is an exception
    var uNavnParam = new SQLiteParameter("@uNavnParam", SqlDbType.Text) { Value = uNavn }; 
    var bNavnParam = new SQLiteParameter("@bNavnParam", SqlDbType.Text) { Value = bNavn };
    var passwdParam = new SQLiteParameter("@passwdParam", SqlDbType.Text) {Value = passwd};
    var pc_idParam = new SQLiteParameter("@pc_idParam", SqlDbType.TinyInt) { Value = pc_id };
    var noterParam = new SQLiteParameter("@noterParam", SqlDbType.Text) { Value = noter };
    var licens_idParam = new SQLiteParameter("@licens_idParam", SqlDbType.TinyInt) { Value = licens_id };

    var insertSQL = new SQLiteCommand("INSERT INTO Brugere (navn, brugernavn, password, pc_id, noter, licens_id)" +
    "VALUES ('@uNameParam', '@bNavnParam', '@passwdParam', '@pc_idParam', '@noterParam', '@licens_idParam')", conn);
    insertSQL.Parameters.Add(uNavnParam); //replace paramenter with verified userinput
    insertSQL.Parameters.Add(bNavnParam);
    insertSQL.Parameters.Add(passwdParam);
    insertSQL.Parameters.Add(pc_idParam);
    insertSQL.Parameters.Add(noterParam);
    insertSQL.Parameters.Add(licens_idParam);
    insertSQL.ExecuteNonQuery(); //Execute query

    //Close connection
    DBConnection.CloseDB(conn);

    //Let the user know that it was changed succesfully
    this.Text = "Succes! Changed!";
}
catch(SQLiteException e)
{
    //Catch error
    MessageBox.Show(e.ToString(), "ALARM");
}

它执行得很好,但是当我查看我的“brugere”表时,它插入了以下值:'@uNameParam'、'@bNavnParam'、'@passwdParam'、'@pc_idParam'、'@noterParam'、'@ licens_idParam' 从字面上看。而不是替换它们。

我尝试过设置断点并检查参数,它们确实具有正确的赋值。所以这也不是问题。

我现在一直在修修补补,没有运气,有人可以帮忙吗?

哦,作为参考,这里是 DBConnection 类中的 OpenDB 方法:

public static SQLiteConnection OpenDB()
{
    try
    {
        //Gets connectionstring from app.config
        const string myConnectString = "data source=data;";

        var conn = new SQLiteConnection(myConnectString);
        conn.Open();
        return conn;
    }

    catch (SQLiteException e)
    {
        MessageBox.Show(e.ToString(), "ALARM");
        return null;
    }
}

【问题讨论】:

    标签: c# parameters system.data.sqlite


    【解决方案1】:

    当您使用System.Data.SqlClient 时,您提供来自System.Data.SqlDbType 枚举的参数类型。

    但是如果你使用System.Data.SQLite那么你必须使用**System.Data.DbType**枚举。

    【讨论】:

      【解决方案2】:

      您应该删除 INSERT 语句中参数名称周围的引号。

      所以不是

      VALUES ('@uNameParam', '@bNavnParam', '@passwdParam', '@pc_idParam',
              '@noterParam', '@licens_idParam')
      

      使用

      VALUES (@uNameParam, @bNavnParam, @passwdParam, @pc_idParam,
              @noterParam, @licens_idParam)
      

      【讨论】:

      • 对不起,不,我也试过了。它会给出以下错误:“提供给命令的参数不足”
      • 啊,我明白你的问题了。并非所有参数名称都相同:@uNavnParam 与 @uNameParam。这是一个简单的错字:)
      • 而且您仍然应该删除参数周围的单引号。
      • 是的,你是对的,所以大惊小怪只是一个愚蠢的错字:( ("INSERT INTO Brugere (navn, brugernavn, password, pc_id, noter, licens_id) 值 (@uNavnParam, @bNavnParam, @ passwdParam, @pc_idParam, @noterParam, @licens_idParam)", conn); = 输入错误。我希望这不是另一个愚蠢的错字。
      • 这可能是另外一回事。您可以尝试找出发送到数据库的确切 SQL 语句,并检查直接执行该语句时生成的错误消息。
      【解决方案3】:

      替换

      值('@uNameParam'、'@bNavnParam'、 '@passwdParam', '@pc_idParam', '@noterParam'、'@licens_idParam')

      值(?、?、?、?、?、?)

      【讨论】:

        【解决方案4】:

        感谢 rwwilden 和 Jorge Villuendas,答案是:

        var insertSQL = new SQLiteCommand("INSERT INTO Brugere (navn, brugernavn, password, pc_id, noter, licens_id)" +
        " VALUES (@uNavnParam, @bNavnParam, @passwdParam, @pc_idParam, @noterParam, @licens_idParam)", conn);
        insertSQL.Parameters.AddWithValue("@uNavnParam", uNavn);
        insertSQL.Parameters.AddWithValue("@bNavnParam", bNavn);
        insertSQL.Parameters.AddWithValue("@passwdParam", passwd);
        insertSQL.Parameters.AddWithValue("@pc_idParam", pc_id);
        insertSQL.Parameters.AddWithValue("@noterParam", noter);
        insertSQL.Parameters.AddWithValue("@licens_idParam", licens_id);
        
        insertSQL.ExecuteNonQuery(); //Execute query
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-20
          • 2010-10-14
          • 2011-01-24
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          • 1970-01-01
          相关资源
          最近更新 更多