目前我正在编写一种从 CSV 文件读取数据并导入到 SQL 表的方法。
DataTable dt = new DataTable();
String line = null;
int i = 0;
while ((line = reader.ReadLine()) != null)
{
String[] data = line.Split(',');
if (data.Length > 0)
{
if (i == 0)
{
foreach (object item in data)
{
DataColumn c = new DataColumn(Convert.ToString(item));
if (Convert.ToString(item).Contains("DATE"))
{
c.DataType = System.Type.GetType("System.DateTime");
}
else { c.DataType = System.Type.GetType("System.String"); }
dt.Columns.Add(c);
}
i++;
}
else
{
DataRow row = dt.NewRow();
for (int j = 0; j < …Run Code Online (Sandbox Code Playgroud) 注意:虽然我的目标是Windows Phone 7,但除了大小限制外,它不会引入任何内容.
为了尝试为Windows Phone 7编写GPS /路由/地图应用程序,我正在尝试使用OpenStreetMap,我希望将我的数据存储在Windows Phone 7上的SQL Server Compact Edition数据库中.这给我带来了很多麻烦,所以我正在弄清楚正确的方法是什么......
这是我的进步:
我已下载Belgium.osm.pbf,其中包含PBF格式的所有比利时OSM数据.
请注意,比利时并不是那么大,这是我居住的国家,所以它似乎是一个良好的开端.
如果我的数据库接近该PBF文件的大小,那将是很好的,因为它只有80 MB ...
使用Marc Gravell的protobuf-net,我现在编写了一个解析器,它给了我所有的OSM数据.
在第一次尝试时,我试图将其全部加载到内存中,但这似乎对我的Windows Phone 7来说太大了,因为它导致大小> 512 MB.然后我的想法是我需要一个数据库来存储这些信息,所以将它存储在SQL Server Compact Edition sdf文件中似乎是逻辑.
因此,我在LINQ to SQL中创建了以下DataContext和Tables:
public class RoutingContext : DataContext
{
public RoutingContext()
#if WINDOWS_PHONE
: base("Data Source = 'isostore:/RoutingDB.sdf'; Max Database Size = 1024; Max Buffer Size = 65536")
#else
: base("Data Source = './RoutingDB.sdf'; Max Database Size …Run Code Online (Sandbox Code Playgroud)我试图用SQLBulkCopy向SQL Server插入一个通用列表,
我在Identity Field遇到麻烦
我想要我的目标表来生成标识字段我应该如何处理这个,这是我的代码
using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
{
bulkCopy.BatchSize = (int)DetailLines;
bulkCopy.DestinationTableName = "dbo.tMyTable";
var table = new DataTable();
var props = TypeDescriptor.GetProperties(typeof(tBFFormularyStatusList))
//Dirty hack to make sure we only have system data types
//i.e. filter out the relationships/collections
.Cast<PropertyDescriptor>()
.Where(propertyInfo => propertyInfo.PropertyType.Namespace.Equals("System"))
.ToArray();
foreach (var propertyInfo in props)
{
bulkCopy.ColumnMappings.Add(propertyInfo.Name, propertyInfo.Name);
table.Columns.Add(propertyInfo.Name, Nullable.GetUnderlyingType(propertyInfo.PropertyType) ?? propertyInfo.PropertyType);
}
var values = new object[props.Length];
foreach (var item in myGenericList)
{
for (var i = 0; i < values.Length; …Run Code Online (Sandbox Code Playgroud) 我必须批量插入很多实体,所以我想最好的方法是使用SqlBulkCopy类。但是,该类对DataReader实例进行操作,而我的代码使用 IEnumerable,其中 T 是我的实体类。要将我的 IEnumerable 转换为 DataReader,我找到了以下代码:LINQ Entity Data Reader。
这段代码工作正常,但有一个问题:我的实体类型上的枚举属性未包含在数据读取器中(因此未正确插入)。如何识别枚举类型的属性?
我正在使用SqlBulkCopy类执行SQL批量复制。我创建了目标表,使其与源表完全相同。它们都具有相同的表名,列名,数据类型,甚至具有相同的排序规则。我也做了sql映射以确保准确性。
我的代码如下:
SqlConnection SourceConnection = new SqlConnection(SourceConnectionString);
SqlConnection DestinationConnection = new SqlConnection(DestinationConnectionString);
DestinationConnection.Open();
SourceConnection.Open();
SqlCommand commandSourceData = new SqlCommand("SELECT * FROM Requisitions;", SourceConnection);
SqlDataReader reader = commandSourceData.ExecuteReader();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(DestinationConnection))
{
bulkCopy.DestinationTableName = "Requisitions";
bulkCopy.ColumnMappings.Add("RequisitionId", "RequisitionId");
bulkCopy.ColumnMappings.Add("CreatedBy", "CreatedBy");
bulkCopy.ColumnMappings.Add("DateCreated", "DateCreated");
bulkCopy.ColumnMappings.Add("AircraftTailNum", "AircraftTailNum");
bulkCopy.ColumnMappings.Add("JobNumber", "JobNumber");
bulkCopy.ColumnMappings.Add("ShopCode", "ShopCode");
bulkCopy.ColumnMappings.Add("RequestedByName", "RequestedByName");
bulkCopy.ColumnMappings.Add("RequestedById", "RequestedById");
bulkCopy.ColumnMappings.Add("Status", "Status");
bulkCopy.ColumnMappings.Add("IsCancelled", "IsCancelled");
bulkCopy.ColumnMappings.Add("IsProcessed", "IsProcessed");
try
{
// Write from the source to the destination.
bulkCopy.WriteToServer(reader);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
reader.Close(); …Run Code Online (Sandbox Code Playgroud) 从文件复制数据时,使用"command tag"获取psql中的行数:
db=# COPY t FROM '/var/lib/postgres/test.sql';
COPY 10Run Code Online (Sandbox Code Playgroud)
我需要行数,并希望避免count()表上的冗余.
有没有办法COPY直接从PL/pgSQL函数中获取这个数?
据我所知,没有,但也许我错过了什么?
对于PostgreSQL 9.2.但任何版本中的任何选项都会引起关注.
我正在使用MiniProfiler来配置我的sql命令.
我正在处理的一个问题是由linq生成的重复INSERT语句.
我已将它们转换为SqlBulkCopy命令,但现在它似乎没有将它记录在MiniProfiler的sql视图中.
是否会为SqlBulkCopy提供相关的命令字符串?
是否可以将批量副本显示在sql命令列表中?
我至少可以在%sql位中计算它吗?
我知道我可以使用MiniProfiler.Current.Step("Doing Bulk Copy")但不会算作SQL,并且不会在列表中显示任何细节.
目前的代码如下:
public static void BulkInsertAll<T>(this DataContext dc, IEnumerable<T> entities)
{
var conn = (dc.Connection as ProfiledDbConnection).InnerConnection as SqlConnection;
conn.Open();
Type t = typeof(T);
var tableAttribute = (TableAttribute)t.GetCustomAttributes(
typeof(TableAttribute), false).Single();
var bulkCopy = new SqlBulkCopy(conn)
{
DestinationTableName = tableAttribute.Name
};
//....
bulkCopy.WriteToServer(table);
}
Run Code Online (Sandbox Code Playgroud) 我需要将大量数据移动到sql server 2008数据库.我从源服务器获取数据并使用SqlBulkCopy写入目标服务器.必须从存储过程中解析此数据,然后将其删除.我想创建一个临时数据但是,如果我使用SqlCommand在客户端上创建临时数据,SqlBulkCopy可以访问该表并且工作正常,如果我在服务器上使用存储过程执行相同的脚本,则SqlBulkCopy.WriteToServer返回InvalidOperationException"无法访问目标表'#Tax'"
这是完美的代码:
SqlDataReader oSqlDataReader -> read form server source
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget)
SqlCommand oSqlCommand = new SqlCommand("Create Table #Tax (Id int)", oSqlConnection);
oSqlCommand.CommandType = CommandType.Text;
oSqlCommand.CommandTimeout = 0;
oSqlCommand.ExecuteNonQuery();
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection)
oSqlBulkCopy.DestinationTableName = "#Tax";
oSqlBulkCopy.WriteToServer(oSqlDataReader);
Run Code Online (Sandbox Code Playgroud)
这是抛出InvalidOperationException异常的代码:
SqlDataReader oSqlDataReader -> read form server a
SqlConnection oSqlConnection = new SqlConnection(_ConnectionTarget)
SqlCommand oSqlCommand = new SqlCommand("SP_CreateTax", oSqlConnection);
oSqlCommand.CommandType = CommandType.StoredProcedure;
oSqlCommand.CommandTimeout = 0;
oSqlCommand.ExecuteNonQuery();
SqlBulkCopy oSqlBulkCopy = new SqlBulkCopy(oSqlConnection)
oSqlBulkCopy.DestinationTableName = "#Tax";
oSqlBulkCopy.WriteToServer(oSqlDataReader);
Run Code Online (Sandbox Code Playgroud)
SP_CreateTax:
Create Procedure …Run Code Online (Sandbox Code Playgroud) 我基本上是从数据库背景和新的.net的东西.如果我的问题听起来很愚蠢,请耐心等待.
我在我的代码中使用SqlBulkCopy将数据从一个SQL Server传输到另一个SQL Server.但由于网络问题,它经常失败.为了避免这种情况,我打算做两件事
减小批量大小(从5000到1000)并增加超时(从3分钟到1分钟)
实现重试逻辑
我的问题是
我正在使用的示例代码:
private void BulkCopyTable(string schemaName, string tableName)
{using (var reader = srcConnection.ExecuteReader($"select * from [{SourceDBName}].[{schemaName}].[{tableName}]"))
{
const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.KeepNulls |
SqlBulkCopyOptions.KeepIdentity;
using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions))
{
const int threeMinutes = 60*3;
bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch
bcp.BatchSize = 5000;
bcp.DestinationTableName = $"[{DestinationDB}].[{schemaName}].[{tableName}]";
bcp.EnableStreaming = true;
foreach (var col …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序可以一次将多行插入到 SQL Server 中。
我使用SqlBulkCopy类或自己编写的代码来生成一个巨大的insert into table_name(...) values (...)语句。
我的表有几个索引和一个聚集索引。
问题是:这些索引是如何更新的?对于我插入的每一行?每笔交易?
有点奇怪的问题 - 这种情况是否有一个通用术语,例如“批量插入索引行为”?我试图用谷歌搜索几个关键字组合,没有找到任何东西。我问的原因是因为我有时会使用 Postgres 并且也想知道它的行为。
我一直试图找到关于这个主题的文章,好几次了,没有任何运气。
如果你能指点我任何文档、文章或有相关章节的书,那就太好了
sqlbulkcopy ×10
c# ×5
sql-server ×3
.net ×1
asp.net ×1
bulkinsert ×1
c#-4.0 ×1
count ×1
csv ×1
enums ×1
indexing ×1
linq-to-sql ×1
plpgsql ×1
postgresql ×1
sql ×1