如何避免 SqlBulkCopy 从 C# 到 SQL Server 中的小数点四舍五入?

问题描述 投票:0回答:1

我正在使用

.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 输出。

csvfile

SQL output

预期输出:例如SQL Server表中的

.CSV
文件数据。

c# sql-server csv datatable sqlbulkcopy
1个回答
0
投票

表格设计很重要

目标表的表设计和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 上实现的

© www.soinside.com 2019 - 2024. All rights reserved.