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
带SQLite和外键的C#_C#_Sqlite - Fatal编程技术网

带SQLite和外键的C#

带SQLite和外键的C#,c#,sqlite,C#,Sqlite,我想为我们的软件实现一个患者数据库,但外键语句有问题。我使用的是最新的SQLite DLL,带有C# 当我尝试运行以下代码时: dbConnection = "Data Source=SQLiteMyDatabase.db;foreign keys=true;"; if (connections == 0) { cnn = new SQLiteConnection(dbConnection); cnn.Open(); this.ExecuteNonQuery("CREATE TABL

我想为我们的软件实现一个患者数据库,但外键语句有问题。我使用的是最新的SQLite DLL,带有C#

当我尝试运行以下代码时:

dbConnection = "Data Source=SQLiteMyDatabase.db;foreign keys=true;";
if (connections == 0)
{
  cnn = new SQLiteConnection(dbConnection);
  cnn.Open();
  this.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS patients ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name VARCHAR(100) NOT NULL;");
  this.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS images ( FOREIGN KEY (patientID) REFERENCES patients(id), nameRed VARCHAR(20) NOT NULL PRIMARY KEY;");
}
我得到一个错误:

SQLite error near "FOREIGN": syntax error

为什么会发生这种情况?

要创建外键,必须首先创建列:

CREATE TABLE IF NOT EXISTS images (
    nameRed VARCHAR(20) NOT NULL PRIMARY KEY, 
    patientID INT, 
    FOREIGN KEY (patientID) REFERENCES patients(id) 
 );
请注意:

  • 我在创建的列列表中首先移动了主键列(
    nameRed
    ),但这只是惯例。它可以排在第二位
  • 您使用的数据类型VARCHAR和SQlite将接受这一点,但请注意,它被映射到类型TEXT,最大长度将被忽略,并且您将能够在列中存储其他数据类型。SQLite在数据类型方面有点滑稽(它有一个经过深思熟虑的系统,但它与大多数其他SQL数据库有很大的不同)
  • 为了使事情更加混乱,允许您将主键声明为列的属性(尽管您也可以在列列表之后使用外键进行声明)

  • 要创建外键,必须首先创建列:

    CREATE TABLE IF NOT EXISTS images (
        nameRed VARCHAR(20) NOT NULL PRIMARY KEY, 
        patientID INT, 
        FOREIGN KEY (patientID) REFERENCES patients(id) 
     );
    
    请注意:

  • 我在创建的列列表中首先移动了主键列(
    nameRed
    ),但这只是惯例。它可以排在第二位
  • 您使用的数据类型VARCHAR和SQlite将接受这一点,但请注意,它被映射到类型TEXT,最大长度将被忽略,并且您将能够在列中存储其他数据类型。SQLite在数据类型方面有点滑稽(它有一个经过深思熟虑的系统,但它与大多数其他SQL数据库有很大的不同)
  • 为了使事情更加混乱,允许您将主键声明为列的属性(尽管您也可以在列列表之后使用外键进行声明)

  • 你确定这个.ExecuteNonQuery语句没有错吗?你是什么意思?第一个数据表工作正常,我的第二个查询中肯定有什么地方出错了。我已经测试了第一个表,它工作正常,第二个表导致错误。是的,这个语句是错误的,但我还不知道在哪里。这应该是cnn。ExecuteOnQuery…cnn是类的一个私有静态对象,它将使用cnn上的ExecuteOnQuery,这本身就可以工作。你确定这个。ExecuteOnQuery不是错误的语句吗?你是什么意思?第一个数据表工作正常,我的第二个查询中肯定有什么地方出错了。我已经测试了第一个表,它工作正常,第二个表导致错误。是的,这个语句是错误的,但我还不知道在哪里。这应该是cnn。ExecuteOnQuery…cnn是类的私有静态对象,将使用cnn上的ExecuteOnQuery,这本身就很好。啊,很好,谢谢,它现在可以工作了。我对数据库不太熟悉,也看不出有什么问题。第二条评论是什么意思?“您将能够在列中存储其他数据类型”?SQLite使用动态类型;它允许您在列中插入任何内容。看,啊,不错,我从来不知道。非常感谢。啊,很好,谢谢,现在可以用了。我对数据库不太熟悉,也看不出有什么问题。第二条评论是什么意思?“您将能够在列中存储其他数据类型”?SQLite使用动态类型;它允许您在列中插入任何内容。看,啊,不错,我从来不知道。谢谢。