【问题标题】:How to insert a datatable to an access database in C#如何在 C# 中将数据表插入到 access 数据库中
【发布时间】:2016-04-12 19:51:36
【问题描述】:

我有 2 个table 访问database

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

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

{"查询表达式'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();
}  

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

【问题讨论】:

    标签: c# ms-access


    【解决方案1】:

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

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

    但您可以简单地构建一个 SELECT .... INTO 语句,它会为您完成所有工作,而无需使用 DataTables 和适配器

    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 来执行。

    【讨论】:

    • 谢谢,我从 FeedLibrary 中选择了具有特定 ID 的内容,那怎么样?
    • 好吧,添加了WHERE部分缺失并使用参数而不是字符串连接(当然我假设ID字段是数据库上的Integer类型)
    • tnx 再次我尝试了您的鳕鱼,这是第一次工作(它创建了表),但之后提要不会添加到此表中,例外是:{“表 'SelectedFeeds' 已经存在。"}
    • 如果表已经存在,那么查询应该改为 INSERT INTO .... SELECT
    • 很抱歉打扰您,使用您编辑的代码会出现此异常{“查询表达式中的语法错误(缺少运算符)* FeedLibrary\r\n where FeedLibrary.ID=@i'。”}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多