首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用SqlServer从csv导入值到c#

如何使用SqlServer从csv导入值到c#
EN

Stack Overflow用户
提问于 2022-02-01 11:08:04
回答 2查看 450关注 0票数 1

我遇到了这个问题,我正在尝试从csv 导入数据,插入部件工作,但是现在我一直收到一个错误:

算术溢出错误将int转换为数据类型数字

。语句是terminated.It,可能是因为我将id作为第一个属性,但是如果我通过省略id来“移动”数组,则会再次得到错误,但不同之处是,“索引超出了数组的界限。

学生班是来自csv文件的简单id、firstName、lastName、工资值:

代码语言:javascript
运行
复制
public void Import()
{
    var lineNumber = 0;           //method for connection
    using (SqlConnection conn = DatabaseSingleton.GetInstance())
    {
        //conn.Open();  //In my project there is my string path to csv file
        using (StreamReader reader = new StreamReader(myStringPath))
        {
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                if (lineNumber != 0)
                {
                var values = line.Split(',');
                            using (command = new SqlCommand("INSERT INTO uzivatel_Barabas VALUES (@id ,@first_Name, @last_Name,@salary) ", conn)) {
                                command.Parameters.Add(new SqlParameter("@id", Convert.ToInt32(values[0].ToString())));
                                command.Parameters.Add(new SqlParameter("@first_Name", values[1].ToString()));
                                command.Parameters.Add(new SqlParameter("@last_Name",values[2].ToString()));
                                command.Parameters.Add(new SqlParameter("@salary", Convert.ToDouble(values[3].ToString())));
                                //var sql = "INSERT INTO uzivatel_Barabas VALUES (@first_Name,@last_Name,@salary)";
                                command.Connection = conn;
                            command.ExecuteNonQuery();
                }
                lineNumber++;
            }
        }
        conn.Close();
    }
    Console.WriteLine("Products Import Complete");
    Console.ReadLine();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-01 15:57:12

正如注释中提到的,您应该使用一个库来解析CSV。String.Split不处理CSV文件中可能存在的边缘情况:例如带有分隔符和新行的引用字段。

我维护了一个库Sylvan.Data.Csv,这使得将CSV数据大容量加载到一个SQL数据库非常容易。关键是它允许使用SqlBulkCopy,而不是在循环中使用insert SqlCommand,这样做的速度要快很多。SqlBulkCopy要求传入的列类型与目标表的类型匹配。我的库允许将架构应用于CSV数据以启用此场景。

假设CSV文件的列直接映射到目标SQL表上,那么它可以在很少的代码行中完成。

代码语言:javascript
运行
复制
using SqlConnection conn = ...;

// Read the schema for the target table
using var cmd = conn.CreateCommand();
cmd.CommandText = "select top 0 * from uzivatel_Barabas";
using var reader = cmd.ExecuteReader();
var tableSchema = reader.GetColumnSchema();

// apply the schema of the target SQL table to the CSV data reader
// this is require for the SqlBulkCopy to process the data as the
// correct type without manual conversions.
var options = 
    new CsvDataReaderOptions { 
        Schema = new CsvSchema(tableSchema)
    };

using var csv = CsvDataReader.Create("uzivatel_Barabas.csv", options);

using var bcp = new SqlBulkCopy(conn);
bcp.DestinationTableName = "uzivatel_Barabas";
bcp.WriteToServer(csv);

Sylvan.Data.Csv也是.NET的最快CSV解析器,所以这应该是将数据导入SqlServer的绝对最快的方法。

票数 2
EN

Stack Overflow用户

发布于 2022-02-01 11:49:42

我认为,这个字符串"var -> = line.Split(',‘)“中的问题是,在这个字符串之后,您的值将是字符串类型,所以当您尝试将其存储到数据库时,您将得到一个字符串的errore int。‘.’-字符串类型尝试在没有‘’的情况下写入数字值

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70939556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档