我正在使用
.csv
将 SqlBulkCopy
文件数据导入到 SQL Server 表中。我的 .csv
文件可以是任何格式,因为我无法确定其中的列,并且同一列的数据类型可以具有小数和文本值,因此我需要在 .csv
文件中传递该值。但由于某种原因,某些 .csv
文件小数点四舍五入。
SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Live"].ConnectionString);
objConn.Open();
SqlBulkCopy objbulkinsert = new SqlBulkCopy(objConn);
objbulkinsert.DestinationTableName = "Mappingtable";
foreach (DataColumn column in csvData.Columns)
{
objbulkinsert.ColumnMappings.Add(column.ColumnName.ToString(), column.ColumnName.ToString());
}
objbulkinsert.BulkCopyTimeout = 0;
objbulkinsert.WriteToServer(csvData);
objConn.Close();
它适用于其他文件。我不知道
.csv
文件是否有问题,但用记事本打开它会显示小数点。我将附上 .csv
文件的图像和我得到的 SQL 输出。
预期输出:例如SQL Server表中的
.CSV
文件数据。
表格设计很重要
目标表的表设计和CSV的视图未知。这让人很难回答。目标表中的 Column2 可以是 DECIMAL 或 MONEY,并且必须有 2 位小数位存储在小数点右侧。 如果数据类型为DECIMAL,没有任何小数位 上传不带小数位的数据。 这可能发生在您身上。 我假设文本文件(MappingTable.CSV)是类似的东西
/94HD012,194.37,10
/94HD013,483.37,
/94HD014,100,1
11-0001,112.57,100
目的地的结构将是
CREATE TABLE [dbo].[MappingTable](
[Column1] [varchar](50) NULL,
[Column2] [decimal](12, 2) NULL,
[Column3] [varchar](50) NULL,
[Column4] [varchar](50) NULL
)
最后,使用下面的代码就可以正常运行了。
private void btnSQLBulkCopyCSV_Click(object sender, EventArgs e)
{
DataTable dataTable = new DataTable();
string ConnStr = "Data Source= MyDB; Database=Learning; Integrated Security=SSPI;";
SqlConnection objConn = new SqlConnection(ConnStr);
objConn.Open();
using (StreamReader reader = new StreamReader(@"E:\\Learning\\CSharp\\SampleData\MappingTable.csv"))
{
string[] headers = reader.ReadLine().Split(',');
int columnCount = headers.Count();
DataColumn[] columns; //
columns = Enumerable.Range(1, columnCount).Select(x => new DataColumn($"Column{x}")).ToArray();
dataTable.Columns.AddRange(columns);
DataRow dataRow1 = dataTable.NewRow();
for (int i = 0; i < columnCount; i++)
{
dataRow1[i] = headers[i];
}
dataTable.Rows.Add(dataRow1);
while (!reader.EndOfStream)
{
string[] rows = reader.ReadLine().Split(',');
DataRow dataRow = dataTable.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dataRow[i] = rows[i];
}
dataTable.Rows.Add(dataRow);
}
SqlBulkCopy objbulkinsert = new SqlBulkCopy(objConn);
objbulkinsert.DestinationTableName = "Mappingtable";
foreach (DataColumn column in dataTable.Columns)
{
objbulkinsert.ColumnMappings.Add(column.ColumnName.ToString(), column.ColumnName.ToString());
}
objbulkinsert.BulkCopyTimeout = 0;
objbulkinsert.WriteToServer(dataTable);
objConn.Close();
}
}
这是在 .Net Framework 4.7.2 上实现的