Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 即使插入了行,SQLite也会报告插入查询错误_C#_Sqlite - Fatal编程技术网

C# 即使插入了行,SQLite也会报告插入查询错误

C# 即使插入了行,SQLite也会报告插入查询错误,c#,sqlite,C#,Sqlite,我使用的是1.0.82.0版 当我插入这样的行时: "INSERT INTO [testtable] (col1,col2) values ('','')" 我总是从SQLiteCommand.ExecuteNonQuery()中得到一个结果1应该返回0(确定)或101(完成)的位置。我知道行插入得很好,因为每次运行该方法时,自动增量值都会增加 班级 readonly object _threadlock = new object(); readonly string _file; publ

我使用的是1.0.82.0版

当我插入这样的行时:

"INSERT INTO [testtable] (col1,col2) values ('','')"
我总是从
SQLiteCommand.ExecuteNonQuery()中得到一个结果1应该返回0(确定)或101(完成)的位置。我知道行插入得很好,因为每次运行该方法时,自动增量值都会增加

班级

readonly object _threadlock = new object();
readonly string _file;

public CSQLite(string file)
{
    _file = file;
}

private SQLiteConnection _sqlCon;
private SQLiteCommand _sqlCmd;
private SQLiteDataAdapter _db;

private void SetConnection()
{
    lock (_threadlock)
    {
        _sqlCon = new SQLiteConnection(String.Format("Data Source={0};Version=3;New=False;Compress=True;", _file));
    }
}

public int SimpleInsertAndGetlastID(out int id)
{
    lock (_threadlock)
    {
        SetConnection();
        _sqlCon.Open();

        //Execute
        _sqlCmd = _sqlCon.CreateCommand();
        _sqlCmd.CommandText = "INSERT INTO [testtable] (col1,col2) values ('','')";
        var res = _sqlCmd.ExecuteNonQuery();

        //Get id
        _db = new SQLiteDataAdapter("select last_insert_rowid();", _sqlCon);
        var ds = new DataSet();
        _db.Fill(ds);
        DataTable dt = ds.Tables[0];
        var val = dt.Rows[0][0].ToString();

        Int32.TryParse(val, out id);

        _sqlCon.Close();
        return res;
    }
}
测试:

/// <summary>
///A test for SimpleInsertAndGetlastID
///</summary>
[TestMethod()]
public void SimpleInsertAndGetlastIDTest()
{
    var file = "dbs\\test.db";
    var target = new CSQLite(file);
    var id = -1;
    var res = -1;

    try
    {
        res = target.SimpleInsertAndGetlastID(out id);
    }
    catch (Exception ex){/*Breakpoint*/}

    Assert.IsTrue(id > 0); //id gets +1 every time the test is run so the row *is* getting inserted
    Assert.IsTrue(res==0||res==101); //Res is always 1 for some reason
}
//
///SimpleInsertAndGetlastID的测试
///
[TestMethod()]
public void SimpleInsertAndGetlastIDTest()
{
var file=“dbs\\test.db”;
var target=新的CSQLite(文件);
变量id=-1;
var-res=-1;
尝试
{
res=target.SimpleInsertAndGetlastID(out id);
}
catch(异常ex){/*断点*/}
Assert.IsTrue(id>0);//每次运行测试时,id都得到+1,因此插入行*
Assert.IsTrue(res==0 | | res==101);//由于某些原因,res总是1
}
表创建(如果出现问题):

公共列表列{get;set;}
如果(!File.Exists(_dbFile))
SQLiteConnection.CreateFile(_dbFile);
var fieldqry=“”;
var计数=0;
Columns.ForEach((字段)=>
{
计数++;
fieldqry+=String.Format(“[{0}]TEXT NULL”,字段);
if(计数<列数)
fieldqry+=“,”;
});
var qry=String.Format(“如果不存在,则创建表[{0}”)(“+
[ID]整数非空主键自动递增+
"{1}" +
“”;”,表名,字段号);
var sql=新的CSQLite(_dbFile);
var res=sql.Execute(qry);
if(res!=SqLiteErrorCodes.SQLITE\u OK)
抛出新的SqLiteImplementationException(“查询失败”);
其中列为
新列表{“col1”、“col2”}


谁能告诉我我做错了什么吗?

不返回SQLite错误代码,它返回受查询影响的行数。如果插入一行,如果操作成功,1听起来像是预期的结果。

不返回SQLite错误代码,它返回受查询影响的行数。如果插入一行,如果操作成功,1听起来像是预期的结果。

来自ExecuteOnQuery的结果被协调为“受影响的行数”,而不是错误代码:-)

来自ExecuteOnQuery的结果被协调为“受影响的行数”,而不是错误代码:-)

哦,我明白了!那么,1将是完美的结果。那么,返回所有这些的方法是什么呢没关系:哦,我明白了!那么,1将是完美的结果。那么,返回所有这些的方法是什么呢不要介意:
public List<string> Columns { get; set; }

if (!File.Exists(_dbFile))
    SQLiteConnection.CreateFile(_dbFile);

var fieldqry = "";
var count = 0;
Columns.ForEach((field) =>
    {
        count++;

        fieldqry += String.Format("[{0}] TEXT NULL", field);

        if (count < Columns.Count)
            fieldqry += ",";
    });

var qry = String.Format("CREATE TABLE IF NOT EXISTS [{0}](" +
                        "[ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
                        "{1}" +
                        ");", TableName, fieldqry);

var sql = new CSQLite(_dbFile);
var res = sql.Execute(qry);
if(res!=SqLiteErrorCodes.SQLITE_OK)
    throw new SqLiteImplementationException("Query failed.");