如何使用IDbDataAdapter(SqlDataAdapter或OleDbDataAdapter)插入行而不加载整个表?

时间:2011-12-13 20:21:47

标签: c# asp.net .net database

我需要使用OleDbDataAdapter在DataTable中插入一行。但是,我的表有超过100000条记录,我不想加载所有记录。

我当前的代码将所有记录加载到DataTable

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Nodes", _cnAq9);
DataTable dt = new DataTable();
da.Fill(dt);

DataRow dr = dt.NewRow();
dr["nID"] = nNodeID;
dr["csNumber"] = strNumber;
dt.Rows.Add(dr);
da.Update(dt);

有没有办法将数据插入到我的表中而不用我的语句中添加“where 1 = 0”之外的所有行填充我的数据表

修改

我需要使用DataAdapter来执行此操作

4 个答案:

答案 0 :(得分:4)

拨打FillSchema而不是填写

根据要求:

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Nodes", _cnAq9);
DataTable dt = new DataTable();
da.FillSchema(dt, SchemaType.Source);

DataRow dr = dt.NewRow();
dr["nID"] = nNodeID;
dr["csNumber"] = strNumber;
dt.Rows.Add(dr);
da.Update(dt);

答案 1 :(得分:2)

是的,使用DbCommand类来执行INSERT

您的代码可能类似于

using (OleDbConnection connection = new OleDbConnection(connectionString))
{
    var query = "INSERT INTO Nodes (nID, csNumber) " +
                "VALUES (?, ?)";

    var command = new OleDbCommand( query, connection);
    command.Parameters.AddWithValue("@nID", nNodeID);
    command.Parameters.AddWithValue("@csNumber", strNumber);

    connection.Open();
    command.ExecuteNonQuery();
}

答案 2 :(得分:1)

OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM Nodes", _cnAq9);
DataTable dt = new DataTable();
da.FillSchema(dt, SchemaType.Source);

DataRow dr = dt.NewRow();
dr["nID"] = nNodeID;
dr["csNumber"] = strNumber;
dt.Rows.Add(dr);
da.Update(dt);

答案 3 :(得分:-1)

    try   
             oleconnStkNames = new OleDbConnection(strAccessConnectionString);
                oleconnStkNames.Open();                
                OleDbCommand cmd = new OleDbCommand();
                cmd.Connection = oleconnStkNames; //new OleDbConnection(strAccessConnectionString);
                cmd.CommandText = "TheName of your InsertQuery "; // name of the query you want to run
                cmd.CommandType = CommandType.StoredProcedure; // or System.Data.CommandType.Text if you are not using a Access StoredProc
                OleDbDataReader rdr = cmd.ExecuteReader();
    catch (Exception ex)
    {
    bla..bla..bla 

}

//如果你想把它包装在using()中并添加事务处理,请使用我编写的这个例子,以适应你正在做的事情。

            using (OleDbCommand olecmdStkNames = new OleDbCommand(strSQL, oleconnStkNames))
            {
                olecmdStkNames.CommandTimeout = 60;
                oletransStockList = oleconnStkNames.BeginTransaction();
                olecmdStkNames.Transaction = oletransStockList;
                olecmdStkNames.CommandType = System.Data.CommandType.Text;
                try
                {
                    intRecordsAffected = olecmdStkNames.ExecuteNonQuery();
                    oletransStockList.Commit();
                   }
                catch (OleDbException oledbExInsert_Update)
                {
                    oletransStockList.Rollback();
                    Console.WriteLine(oledbExInsert_Update.Message);
                }
                ((IDisposable)oletransStockList).Dispose();
            }