繁体   English   中英

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

[英]How to insert a datatable to an access database in C#

我在Access database有2个table

现在我要从一个table进行选择,然后将它们插入到另一个table

这是我的代码,但在Cmd.ExecuteNonQuery();行中显示了异常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();
}  

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

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

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

但是您可以简单地构建一个SELECT .... INTO语句,无需使用DataTables和Adapters即可为您完成所有操作

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设置为要执行的正确语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM