- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想将 datagridview 行插入到 sql server 表中......现在使用此代码将 DataGridView 中的行值插入表中:
private DataTable GetDataTableFromDGV(DataGridView dgv)
{
var dt = new DataTable();
foreach (DataGridViewColumn column in dgv.Columns)
{
if (column.Visible)
{
dt.Columns.Add();
}
}
object[] cellValues = new object[dgv.Columns.Count];
foreach (DataGridViewRow row in dgv.Rows)
{
for (int i = 0; i < row.Cells.Count; i++)
{
cellValues[i] = row.Cells[i].Value;
}
dt.Rows.Add(cellValues);
}
return dt;
}
private void InsertDTtoDB(string ConnectionString, string TableName, DataGridView DGV)
{
DataTable dt = new DataTable();
dt = GetDataTableFromDGV(DGV);
using (SqlConnection cn = new SqlConnection(ConnectionString))
{
cn.Open();
using (SqlBulkCopy copy = new SqlBulkCopy(cn))
{
copy.ColumnMappings.Add(0, 1);
copy.ColumnMappings.Add(1, 2);
copy.ColumnMappings.Add(2, 3);
copy.ColumnMappings.Add(3, 4);
copy.ColumnMappings.Add(4, 5);
copy.DestinationTableName = TableName;
copy.WriteToServer(dt);
}
}
}
但是插入数据有问题:来自 datatgridview 的空行(启用添加行)存储在最后一个表行中!请注意图片帮助:
最佳答案
首先,一些可能有助于您更好地理解用 C# 编写代码的一般观察:
// this line is declaring a new variable named 'dt'
// and assigning it an instance of a new DataTable
DataTable dt = new DataTable();
// this line is immediately overwriting the new DataTable
// assigned to 'dt' with the DataTable returned from 'GetDataTableFromDGV'
dt = GetDataTableFromDGV(DGV);
上面应该写成声明变量然后赋值:
DataTable dt = GetDataTableFromDGV(DBV);
以下来自 GetDataTableFromDGV
的代码将仅在列可见时向 DataTable 添加一列:
foreach (DataGridViewColumn column in dgv.Columns)
{
if (column.Visible)
{
dt.Columns.Add();
}
}
然后在 InsertDTtoDB
中使用上述 DataTable 的结果,这显然需要在预定义的序号位置设置一定数量的列:
copy.ColumnMappings.Add(0, 1);
// etc...
上面的代码在 GetDataTableFromDGV
中创建的 DataTable 之间创建了一个非常脆弱的关系,它要求 Column 可见,然后在 InsertDTtoDB
中使用。
与其在 DataTable 和 SqlBulkCopy.ColumnMappings 之间使用脆弱的序号关系,不如使用字段名称创建 DataTable,然后映射到 SqlBulkCopy。 `GetDataTableFromDGV' 中的 foreach 则变为:
// assumes the columns in the DataGridView are named as follows:
var columns = new[] {"Id", "Invoice_Id", "Software_Id", "Price", "Quantity", "Sum" }
var dt = new DataTable();
foreach (DataGridViewColumn column in dgv.Columns)
{
// note: this is case-sensitive
if (columns.Contains(column.Name))
{
dt.Columns.Add();
}
}
然后 InsertDTtoDB
中的 ColumnMappings 变成:
copy.ColumnMappings.Add("Invoice_Id", "DestinationCol1");
copy.ColumnMappings.Add("Software_Id", "DestinationCol2");
// etc...
在 GetDataTableFromDGV
中将行添加到 DataTable 时,cellValues
变量在 foreach 循环外声明,但值在内部 for 循环中不断被覆盖。不是将对象数组添加到 DataTable,而是使用实际的列名称构建 DataRow 并将新的 DataRow 添加到 DataTable。
考虑到上述情况,GetDataTableFromDGV
方法变为:
private DataTable GetDataTableFromDGV(DataGridView dgv)
{
// use your actual columns names instead of Col1, Col2, etc...
var columns = new[] {"Invoice_Id", "Software_Id", "Price", "Quantity", "Sum" }
var dt = new DataTable();
foreach (DataGridViewColumn column in dgv.Columns)
{
if (columns.Contains(column.Name))
{
dt.Columns.Add();
}
}
foreach (DataGridViewRow row in dgv.Rows)
{
DataRow newRow = dt.NewRow();
foreach (string columnName in columns)
{
newRow[columnName] = row.Cells[columnName].Value
}
dt.Rows.Add(newRow);
}
return dt;
}
然后 InsertDTtoDB
方法变为:
private void InsertDTtoDB(string ConnectionString, string TableName, DataGridView DGV)
{
DataTable dt = GetDataTableFromDGV(DGV);
using (SqlConnection cn = new SqlConnection(ConnectionString))
{
cn.Open();
using (SqlBulkCopy copy = new SqlBulkCopy(cn))
{
// update the "DestinationCol[x]" values to the destination column names
copy.ColumnMappings.Add("Invoice_Id", "DestinationCol1");
copy.ColumnMappings.Add("Software_Id", "DestinationCol2");
copy.ColumnMappings.Add("Price", "DestinationCol3");
copy.ColumnMappings.Add("Quantity", "DestinationCol4");
copy.ColumnMappings.Add("Sum", "DestinationCol5");
copy.DestinationTableName = TableName;
copy.WriteToServer(dt);
}
}
}
为了回答您关于为什么将空行添加到数据库的问题,我怀疑这是因为 DataGridView 中存在空值。假设是这种情况,则将 DataGridView 中的空值排除在添加到 DataTable 之外。我会关闭其中一个关键列,例如“Invoice_Id”; GetDataTableFromDGV
方法变为:
private DataTable GetDataTableFromDGV(DataGridView dgv)
{
// assumes the columns in the DataGridView are named as follows:
var columns = new[] {"Invoice_Id", "Software_Id", "Price", "Quantity", "Sum" }
var dt = new DataTable();
foreach (DataGridViewColumn column in dgv.Columns)
{
if (columns.Contains(column.Name))
{
dt.Columns.Add();
}
}
foreach (DataGridViewRow row in dgv.Rows)
{
// check if the row has a null "Invoice_Id" and exclude
if(row.Cells["Invoice_Id"] == null
{
continue;
}
DataRow newRow = dt.NewRow();
foreach (string columnName in columns)
{
newRow[columnName] = row.Cells[columnName].Value
}
dt.Rows.Add(newRow);
}
return dt;
}
关于c# - 如何使用 sql Bulkcopy 在表中插入 datagridview 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743663/
全部, 我有以下 BulkCopy 操作: // Convert the FlexGrid to a DataTable. DataTable currData = (DataTable)c1ErrF
我正在尝试将 DataTable 写入到 Sql Server 上的目标表中。 DataTable dt 只包含一列及其名为 Email。我的目标表包含 tpid、lastname、age、date
我写了一个例程来批量导入记录。它不起作用,我认为问题是我在这里没有任何等待,但我不知道如何或在哪里放置它。由于我项目的性质,我不想要方法是一个异步方法。我只是使用异步来通知更新。 public
我在使用 C# 的 asp.net 3.5 中使用 SQL Bulkcopy 时遇到字符串到日期的转换问题 我读取了一个大型 CSV 文件(带 CSV reader )。读取的字符串之一应加载到 SQ
我正在尝试使用 bulkCopy.WriteToServer() 将数据从我的远程 SQL Server Express 复制到我的本地 SQL Server Express,但是没有数据写入我的本地
我正在编写一个 Spring Boot 2 应用程序,我正在使用 SQL 批量复制功能在 SQL Server 2012 数据库中插入多条记录。每次我插入 ~700 行时,我都会泄漏 600 MB 我
我正在使用 SqlBulkCopy 将包含一百万条记录(每条记录大约有 10 列)的 datatable 的内容插入到数据库表中。当我更改批量大小属性 (bulkCopy.BatchSize) 时,我
更新基于已接受的答案: bool success = false; using (var bulkCopy = new SqlBulkCopy(connection)) //using! {
我有一段代码使用 DataReader 和 SqlBulkCopy 将数据从 excel 电子表格复制到 MSSQL 表。它工作正常,直到我在表上创建了一个主键,但现在它失败了。我首先删除 SQL 表
我想从 access .mdb 文件中将数据插入到 sqlserver 中,这是使用 OLEDB 执行数据插入 SQL BulkCopy 或 OPENDATASOURCE 的最快方法。 数据大约是 2
在我的 asp.net 页面中,我正在尝试...... 创建一个临时数据表并用数据填充它(这可行) 将列上的 ColumnMappings 批量复制到目标表 从临时数据表到目标表执行一次bulkCop
我有一个应用程序,通过它我使用 SqlBulkCopy 将批量记录插入到表中。我有一个触发器,它将添加到第一个表中的记录插入到另一个表中。 当我插入时,我在 C# 中编写了 SqlBulkCopyOp
我想将 datagridview 行插入到 sql server 表中......现在使用此代码将 DataGridView 中的行值插入表中: private DataTable GetDataTa
我正在尝试使用 List 更新表格.我创建了一个 EnumExtension 类并创建了一个将我的 Enumerable 转换为 DataTable 的方法: public static DataTa
我有一个表 (A),其中包含一个名为 confirmation_number 的列。它被定义为 varchar2(30) 并包含类似于 SMITERI-2012-02-31-4567 的内容。 我有另
有没有办法将内存数据表(vb.net)及其列(模式)复制到 sql server 新表或现有表中?如果一列已添加到临时表中,是否可以通过 BulkCopy 将新列添加到现有 sql server 表中
我是一名优秀的程序员,十分优秀!