Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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# 如何使用SQL更改表中与另一个表有关系的列?_C#_Sql_Database_Ms Access - Fatal编程技术网

C# 如何使用SQL更改表中与另一个表有关系的列?

C# 如何使用SQL更改表中与另一个表有关系的列?,c#,sql,database,ms-access,C#,Sql,Database,Ms Access,我的数据库中有三个表:Book、Library和AvailableBooks。Book表有一个名为“Book_ID”的主键,库也有一个类似的“Library_ID”主键。这两个字段具有属性AutoNumber,当应用程序启动时,如果表中没有记录,我希望重置该字段。我通过以下方式做到这一点: internal void alterBookTable() { if (isBookTableInitialized) return; List<Book> bo

我的数据库中有三个表:Book、Library和AvailableBooks。Book表有一个名为“Book_ID”的主键,库也有一个类似的“Library_ID”主键。这两个字段具有属性AutoNumber,当应用程序启动时,如果表中没有记录,我希望重置该字段。我通过以下方式做到这一点:

internal void alterBookTable() {
        if (isBookTableInitialized) return;
        List<Book> booksFromDb = getAllBooks();
        if (booksFromDb.Count > 0) return;
        OleDbCommand alterTablesCommand = new OleDbCommand("ALTER TABLE Book ALTER COLUMN Book_ID AUTOINCREMENT(100,1)", DbConnection);
        alterTablesCommand.ExecuteNonQuery();
        isBookTableInitialized = true;
}
“图书ID”字段和“图书馆ID”字段均位于AvailableBooks表中。Book表中的“Book_ID”与AvailableBooks表中的“Book_ID”之间存在一对多关系,与“Library_ID”类似

运行此应用程序时,我得到“System.Data.OleDb.OLEDBEException:无法更改字段'Book_ID'。它是一个或多个关系的一部分”


有没有办法保持相同的关系,但改变字段,使其与所有表一致?

下面的代码似乎可以满足您的要求:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Data.OleDb;
名称空间oleDbTest
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串myConnectionString;
myConnectionString=
@“Provider=Microsoft.ACE.OLEDB.12.0;”+
@“数据源=C:\\ uu tmp\books.accdb;”;
使用(var con=new OleDbConnection())
{
con.ConnectionString=myConnectionString;
con.Open();
使用(var cmd=new OleDbCommand())
{
cmd.Connection=con;
cmd.CommandText=
“更改表可用电子书”+
“删除可用的电子书”;
cmd.ExecuteNonQuery();
cmd.CommandText=
“更改表可用电子书”+
“删除约束库可用电子书”;
cmd.ExecuteNonQuery();
cmd.CommandText=
“更改表格簿”+
“更改列Book_ID自动增量(100,1)”;
cmd.ExecuteNonQuery();
cmd.CommandText=
“更改表库”+
“ALTER COLUMN Library_ID AUTOINCREMENT(100,1)”;
cmd.ExecuteNonQuery();
cmd.CommandText=
“更改表可用电子书”+
“添加约束BookAvailableBooks”+
“外键(图书ID)参考书”;
cmd.ExecuteNonQuery();
cmd.CommandText=
“更改表可用电子书”+
“添加约束库可用电子书”+
“外键(库ID)引用库”;
cmd.ExecuteNonQuery();
}
con.Close();
}
}
}
}

为什么要更改字段?在我关闭应用程序后,数据库仍然存在。如果其中有一本书的书号为123,那么当我再次打开应用程序时,它将保留在数据库中。如果我碰巧清除了数据库中的所有内容,然后在Book表中添加了一条新记录,Book_ID仍将增加1,因此第一条记录的Book_ID可以从124开始。如果表中没有任何数据,我希望Book_ID值在100处重新开始,Library_ID值在300处重新开始,这些数字有什么特别之处?
 OleDbCommand alterTablesCommand = new OleDbCommand("ALTER TABLE Library ALTER COLUMN Library_ID AUTOINCREMENT(300,1)", DbConnection);