在下面的代码中,我尝试将excel中的记录插入到Database表中,但是不会通过excel传递额外的列,该列必须使用从请求的页面分配的常量值(具有不同值的foreach循环)填充.
string CONSTANTVALUE="Test";
bulkCopy.DestinationTableName = "TABLE NAME";
bulkCopy.ColumnMappings.Add("TABLECOLUMN1", "EXCELCOLUMN1");
bulkCopy.ColumnMappings.Add("TABLECOLUMN2", "EXCELCOLUMN2");
bulkCopy.ColumnMappings.Add("TABLECOLUMN3", CONSTANTVALUE);
bulkCopy.WriteToServer(dr);
Run Code Online (Sandbox Code Playgroud)
但代码不起作用.有任何想法吗?
如何将数据从一个数据库复制到具有相同表结构的另一个数据库并保留密钥标识?
我使用Sql Server 2012"Denali",我想从Sql Server 2008 DB复制一些数据.我拥有的表格完全相同,但我希望旧数据库中的数据进入新的"Denali"数据库.数据库位于不同的服务器上.
所以我想要类似的东西
USE newDB;
GO
SELECT *
INTO newTable
FROM OldDb.oldTable WITH (KEEPIDENTITY);
GO
Run Code Online (Sandbox Code Playgroud)
有人建议让这个可行吗?
COPY table_name ( field1, field2, field3) FROM STDIN CSV;
1,2,"q w"
3,4,"a s"
5,6,d
\.
Run Code Online (Sandbox Code Playgroud)
如何通过PDO执行此查询?
问题是PDO驱动程序将此查询作为语句执行.
例如,如果将其粘贴到pgAdmin中,则会引发错误.
我需要执行它psql:
C:\Users\User>psql -e -h localhost -U postgres db_name
psql (9.1.2)
db_name=# COPY table_name ( field1, field2, field3) FROM STDIN CSV;
COPY table_name ( field1, field2, field3) FROM STDIN CSV;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1,2,"q w"
>> 3,4,"a s"
>> 5,6,d
>> …Run Code Online (Sandbox Code Playgroud) 我使用的DB具有French_CI_AS排序规则(CI应代表Case-Insensitive),但无论如何都是区分大小写的.我想知道为什么.
我断言这一点的原因是具有'GIVEN'案例设置的批量插入失败,但是他们成功地使用另一个'Given'案例设置.
例如:
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2") 失败了,但是INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2") 作品.编辑 刚看到这个:
http://msdn.microsoft.com/en-us/library/ms190920.aspx
这意味着应该可以更改列的排序规则而不清空所有数据并重新创建相关表格?
sql-server collation case-sensitive case-insensitive sqlbulkcopy
它适用于所有其他数据类型,但我无法使用'bit'列.
这是我用于批量写入的SQL:
using (var bulk = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity & SqlBulkCopyOptions.KeepNulls))
{
bulk.BatchSize = 2000;
bulk.DestinationTableName = targetTable;
bulk.WriteToServer(dataTable);
}
Run Code Online (Sandbox Code Playgroud)
这是我的数据表:
DataTable dt = new DataTable();
dt.Clear();
dt.Columns.Add("MyBool", typeof(bool)); // Tried with and without typeof(bool)
return dt;
Run Code Online (Sandbox Code Playgroud)
这是我在将行添加到数据表之前构造行的方法.
personAssociationRow["MyBool"] = true;
WriteToServer行会抛出异常,具体取决于是否typeof(bool)指定了:
Cannot insert the value NULL into column 'MyBool', table 但是intellisense/debugger将值显示为 true
要么
The given value of type String from the data source cannot be converted to type int of the specified target column.这是当intellisense/debugger中的值变为"True"ie字符串时. …
我知道我可以通过不指定此处SqlBulkCopyOptions.KeepIdentity提到的标识列来批量插入到我的表中.
我希望能够获得服务器生成的标识值并将它们放在我的数据表中,甚至是列表中.我看到这篇文章,但我希望我的代码是通用的,我的所有表中都没有版本列.任何建议都非常感谢.这是我的代码:
public void BulkInsert(DataTable dataTable, string DestinationTbl, int batchSize)
{
// Get the DataTable
DataTable dtInsertRows = dataTable;
using (SqlBulkCopy sbc = new SqlBulkCopy(sConnectStr))
{
sbc.DestinationTableName = DestinationTbl;
// Number of records to be processed in one go
sbc.BatchSize = batchSize;
// Add your column mappings here
foreach (DataColumn dCol in dtInsertRows.Columns)
{
sbc.ColumnMappings.Add(dCol.ColumnName, dCol.ColumnName);
}
// Finally write to server
sbc.WriteToServer(dtInsertRows);
}
}
Run Code Online (Sandbox Code Playgroud) 更新:这是我的解决方案
我有一个表定义为:
CREATE TABLE [dbo].[csvrf_References]
(
[Ident] [int] IDENTITY(1,1) NOT NULL,
[ReferenceID] [uniqueidentifier] NOT NULL DEFAULT (newsequentialid()),
[Type] [nvarchar](255) NOT NULL,
[Location] [nvarchar](1000) NULL,
[Description] [nvarchar](2000) NULL,
[CreatedOn] [datetime] NOT NULL DEFAULT (getdate()),
[LastUpdatedOn] [datetime] NOT NULL DEFAULT (getdate()),
[LastUpdatedUser] [nvarchar](100) NOT NULL DEFAULT (suser_sname()),
CONSTRAINT [PK_References] PRIMARY KEY NONCLUSTERED ([ReferenceID] ASC)
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我有一个DataTable与表列名和数据类型匹配的列.在DataTable与填写DBNull.Value的CreatedOn,LastUpdatedOn和LastUpdatedUser. ReferenceID已生成.当我调用以下代码时,我得到以下错误.
码:
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, bulkCopyTran);
bulkCopy.DestinationTableName …Run Code Online (Sandbox Code Playgroud) 我需要同时将多行(1000 行)插入到 SQL Server 数据库中。我认为最好的方法是使用,SqlBulkCopy但我不确定如何参数化插入查询以防止 SQL 注入。
你能帮我么?执行多个插入语句(SQL 注入安全)的最佳方法是什么?
谢谢你。
我在Sam Saffron发现了一篇关于批量插入的文章Dapper(那个令人烦恼的插入问题,使用dapper将数据导入数据库),他用语句结束了文章:
例如,如果您需要一种超快速的方法将大量内容插入到SQL DB中,那么没有什么比SqlBulkCopy更好的了,您将需要一个自定义API.
这篇文章已有4年多了.
我最近偶然发现了Dapper Plus,它声称能够在2,000ms内完成1,000,000行,SqlBulkCopy根据我发现的许多旧的性能文章(例如这一个 - 评估批量数据的 ORM),它看起来表现优异.
遗憾的是,我的Google-fu未能找到这两种批量导入方法之间的最新性能比较.
问:是否SqlBulkCopy仍然比快Dapper.NET?
sqlbulkcopy ×10
sql-server ×6
c# ×4
asp.net ×1
bulkinsert ×1
collation ×1
dapper ×1
datatable ×1
identity ×1
null ×1
pdo ×1
performance ×1
php ×1
postgresql ×1
sql ×1