gpt4 book ai didi

c# - 如何在 C# 中将数据表插入到 Access 数据库中

转载 作者:行者123 更新时间:2023-12-03 22:01:23 25 4
gpt4 key购买 nike

我在 Access 数据库中有2个

现在我想从一个中选择并将它们插入到另一个表中。

这是我的代码,但它在 Cmd.ExecuteNonQuery(); 行显示异常

{"Syntax error (missing operator) in query expression 'System.Object[]'."}

代码是:

public static void SetSelectedFeedIntoDB(Form2 frm2)
{
string StrCon = System.Configuration.ConfigurationManager.ConnectionStrings["FeedLibraryConnectionString"].ConnectionString;
OleDbConnection Connection = new OleDbConnection(StrCon);
OleDbDataAdapter DataA = new OleDbDataAdapter("Select * from FeedLibrary where ID=" + frm2.FeedSelectListBox.SelectedValue, Connection);
DataTable DTable = new DataTable();
DataA.Fill(DTable);

OleDbCommand Cmd = new OleDbCommand();
Cmd.Connection = Connection;

Connection.Open();

foreach (DataRow DR in DTable.Rows)
{
Cmd.CommandText = "insert into SelectedFeeds Values(" + DR.ItemArray + ")";
Cmd.ExecuteNonQuery();
}

Connection.Close();
}

我应该怎么做才能解决这个问题?

最佳答案

您的错误是由于您将 DataRow 的 ItemArray 属性连接到字符串而导致的。在这种情况下,ItemArray(即 object[] 的实例)没有自动从其值生成字符串的方法,因此将类名作为字符串“object[]”返回,但当然这会产生无意义的 sql 字符串

"insert into SelectedFeeds Values(object[])";

但你可以简单地构建一个 SELECT .... INTO无需使用数据表和适配器即可为您完成所有工作的声明

string cmdText = @"SELECT FeedLibrary.* INTO [SelectedFeeds] 
FROM FeedLibrary
where ID=@id";
using(OleDbConnection Connection = new OleDbConnection(StrCon))
using(OleDbCommand cmd = new OleDbCommand(cmdText, Connection))
{
Connection.Open();
cmd.Parameters.Add("@id", OleDbType.Integer).Value = Convert.ToInt32( frm2.FeedSelectListBox.SelectedValue);
cmd.ExecuteNonQuery();
}

但是,SELECT ... INTO 语句会创建目标表,但如果目标表已经存在,则会出错。为了解决这个问题,我们需要发现目标是否存在。如果它不存在,我们使用第一个 SELECT ... INTO 查询,否则我们使用 INSERT INTO ..... SELECT

 // First query, this creates the target SelectedFeeds but fail if it exists
string createText = @"SELECT FeedLibrary.* INTO [SelectedFeeds]
FROM FeedLibrary
where ID=@id";
// Second query, it appends to SelectedFeeds but it should exists
string appendText = @"INSERT INTO SelectedFeeds
SELECT * FROM FeedLibrary
WHERE FeedLibrary.ID=@id";

using(OleDbConnection Connection = new OleDbConnection(StrCon))
using(OleDbCommand cmd = new OleDbCommand("", Connection))
{
Connection.Open();

// Get info about the SelectedFeeds table....
var schema = Connection.GetSchema("Tables",
new string[] { null, null, "SelectedFeeds", null});

// Choose which command to execute....
cmd.CommandText = schema.Rows.Count > 0 ? appendText : createText;

// Parameter @id is the same for both queries
cmd.Parameters.Add("@id", OleDbType.Integer).Value = Convert.ToInt32( frm2.FeedSelectListBox.SelectedValue);

cmd.ExecuteNonQuery();
}

这里我们有两个不同的查询,第一个像以前一样创建 SelectedFeeds 表,第二个追加到该表中。
为了发现目标表是否已经创建,我调用了 Connection.GetSchema检索数据表(模式),如果表 SelectedFeeds 存在,则其中有一行,如果没有这样的表,则没有行。
此时,我使用要执行的正确语句设置了 OleDbCommand。

关于c# - 如何在 C# 中将数据表插入到 Access 数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36582815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com