Paradox 插入数据操作必须使用可更新查询
Posted
技术标签:
【中文标题】Paradox 插入数据操作必须使用可更新查询【英文标题】:Paradox Inserting data Operation must use an updateable query 【发布时间】:2014-01-13 14:58:34 【问题描述】:我正在尝试在 Windows 8 中使用 c# 和 oledb 写入 Paradox 数据库文件。我能够删除表、创建表并在收到错误“操作必须使用可更新查询”之前写入第一行.
我已经通过以下方式尝试解决: 1)以管理员身份运行 2)更新应用程序中的权限,以确保我没有文件上的只读或存档属性 3)添加运行用户权限以读取/写入/修改db文件所在的目录 4) 多次更改查询,以防我对查询做一些奇怪的事情
如果我根本无法写入或插入,那么上述步骤将是有意义的,但初始插入有效并且任何其他插入都会失败。
下面的代码显示了我尝试执行操作的当前方式,我已将其留在注释掉的部分中,以便您可以看到我还尝试了哪些其他方法。
public void OverwriteData(string fileName, DataTable dataToWrite)
//split up the filename
string path = Path.GetDirectoryName(fileName);
string file = Path.GetFileName(fileName);
//create the string for creating the table
string strTempCreate = "";
//string strTempInsert = "";
foreach (DataColumn column in dataToWrite.Columns)
if (strTempCreate != "")
strTempCreate = strTempCreate + ", ";
strTempCreate = strTempCreate + "[" + column.ColumnName + "]" + " char(30)";
/*if (strTempInsert != "")
strTempInsert = strTempInsert + ", ";
strTempInsert = strTempInsert + column.ColumnName;*/
string createTableStr = "CREATE TABLE " + file + " (" + strTempCreate + ")";
string dropTableStr = "DROP TABLE " + file;
//build the sql insert command
//string insertSql = "insert into " + file + " values ";
/*foreach (DataRow row in dataToWrite.Rows)
insertSql = insertSql + row.Field<string>;
*/
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + @";Extended Properties=Paradox 5.x;";
//DataTable results = new DataTable();
using (OleDbConnection conn = new OleDbConnection(connectionString))
conn.Open();
OleDbCommand dbCommand = new OleDbCommand();
dbCommand.Connection = conn;
dbCommand.CommandText = dropTableStr;
try
dbCommand.ExecuteNonQuery();
catch
dbCommand.CommandText = createTableStr;
dbCommand.ExecuteNonQuery();
//try to do the insert
StringBuilder sb = new StringBuilder();
//make sure that the database is not readonly
FileAttributes attributes = File.GetAttributes(fileName);
if ((attributes & FileAttributes.Archive) == FileAttributes.Archive)
attributes = attributes & ~FileAttributes.Archive;
File.SetAttributes(fileName, attributes);
//then we want to try and connect to this database to put data into it
string selectSQL = "Select * from " + file;
using (var adapter = new OleDbDataAdapter(selectSQL, conn))
using (var builder = new OleDbCommandBuilder(adapter))
var destinationTable = new DataTable();
adapter.Fill(destinationTable);
destinationTable.Merge(dataToWrite,true,MissingSchemaAction.Ignore);
destinationTable.AcceptChanges();
foreach (DataRow row in destinationTable.Rows)
row.SetAdded();
builder.QuotePrefix = "[";
builder.QuoteSuffix = "]";
builder.GetInsertCommand();
adapter.Update(destinationTable);
/*foreach (DataRow row in dataToWrite.Rows)
sb.Clear();
sb.Append("insert into " + file + " values ('");
IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
sb.Append(string.Join("','", fields));
sb.Append("')");
dbCommand.CommandText = sb.ToString();
dbCommand.ExecuteNonQuery();
*/
/*sb.Clear();
sb.Append("insert into " + file);
foreach (DataRow row in dataToWrite.Rows)
sb.Append(" values ('");
IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
sb.Append(string.Join("','", fields));
sb.Append("'),");
sb.Remove(sb.Length - 1, 1);
sb.Append(";");
dbCommand.CommandText = sb.ToString();
dbCommand.ExecuteNonQuery();
*/
【问题讨论】:
这看起来不像是悖论错误。看起来它来自 Jet 或某个中间位置。另外,不清楚 strTempCreate 的值,看起来你试图创建一些东西,然后 Drop 它。当你尝试往里面放东西时,不确定桌子是否在那里。 您找到解决此问题的方法了吗?我也有同样的情况。 【参考方案1】:这篇文章解决了我的问题:https://msdn.microsoft.com/en-us/library/ms715421(v=vs.85).aspx
根据 Microsoft:在以下两种情况下,Paradox 驱动程序无法更新表:
-
当没有在表上定义唯一索引时。这不是真的
一个空表,即使是
表上未定义唯一索引。如果插入单行
在没有唯一索引的空表中,应用程序
无法创建唯一索引或在
已插入单行。
如果没有实现 Borland 数据库引擎。
【讨论】:
“Borland 数据库引擎未实现”是什么意思? 我与 Paradox 和 BDE 合作已经快两年了。这让我很头疼。 IIRC,如果您希望对数据库具有 R/W 访问权限,除了 OOTB Paradox 驱动程序之外,您还需要安装兼容版本的 Borland 数据库引擎。您可以通过对具有现有数据和有效唯一索引的表执行 SQL 插入命令来测试 BDE 驱动程序是否正常工作。你甚至可能需要调整你的连接字符串。以上是关于Paradox 插入数据操作必须使用可更新查询的主要内容,如果未能解决你的问题,请参考以下文章
访问数据库 - 操作必须使用可更新的查询。 (在本地工作正常)