Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将数组/列表中的多行数据插入SQL Server(数据集、数据表)_C#_Sql Server_Visual Studio 2008_.net 3.5_Dataset - Fatal编程技术网

C# 如何将数组/列表中的多行数据插入SQL Server(数据集、数据表)

C# 如何将数组/列表中的多行数据插入SQL Server(数据集、数据表),c#,sql-server,visual-studio-2008,.net-3.5,dataset,C#,Sql Server,Visual Studio 2008,.net 3.5,Dataset,在将数据从变量、数组、列表传输到SQL Server时,我不需要什么帮助 我在SQL方面还不错,但我不熟悉DataSet、DataTable对象 我的数据现在存储在字符串列表(list)中。该列表中的每个字符串都类似于以下内容: QWERTY,19920604,0.91,0.35,0.34,0.35343840 像这样的行大约有90万行,但大型导入只会发生一次 SQL Server中的目标数据类型: BIGINT (primary key, im not inserting it, its id

在将数据从变量、数组、列表传输到SQL Server时,我不需要什么帮助

我在SQL方面还不错,但我不熟悉DataSet、DataTable对象

我的数据现在存储在字符串列表(list)中。该列表中的每个字符串都类似于以下内容:

QWERTY,19920604,0.91,0.35,0.34,0.35343840

像这样的行大约有90万行,但大型导入只会发生一次

SQL Server中的目标数据类型:

BIGINT (primary key, im not inserting it, its identity(1,1))
VARCHAR(10), 
DATE, 
DECIMAL(10,2), 
DECIMAL(10,2), 
DECIMAL(10,2), 
DECIMAL(10,2), 
INT
  • 如何将该数据转换为SQL Server数据类型

  • 如何将该数据插入SQL Server?我还需要一些插入之间的进度条更新

  • 我可以用老式的SQL命令,
    但我终于学会了更现代的方法,通过使用DataTable对象。

    您可以使用sqlbulkcopy,下面是一些示例:

    您可以使用sqlbulkcopy,以下是一些示例:

    使用ADO.NET,最简单、最安全的方法可能是使用循环:

    private void InsertList(IEnumerable<String> list)
    {
        String sql = "INSERT INTO dbo.Table VALUES(@varcharCol,@dateCol,@decCol1,@decCol2,@decCol3,@decCol4,@intCol);";
        using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
        {
            con.Open();
            foreach (String str in list)
            {
                String[] fields = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (fields.Length == 7)
                { 
                    DateTime dateCol;
                    if (DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateCol))
                    {
                        decimal d1, d2, d3, d4;
                        int i1;
                        if(decimal.TryParse(fields[2], out d1)
                            && decimal.TryParse(fields[3], out d2)
                            && decimal.TryParse(fields[4], out d3)
                            && decimal.TryParse(fields[5], out d4)
                            && int.TryParse(fields[6], out i1))
                        {
                            using(var cmd = new SqlCommand(sql, con))
                            {
                                cmd.Parameters.AddWithValue("@varcharCol", fields[0]);
                                cmd.Parameters.AddWithValue("@dateCol", dateCol);
                                cmd.Parameters.AddWithValue("@decCol1", d1);
                                cmd.Parameters.AddWithValue("@decCol2", d2);
                                cmd.Parameters.AddWithValue("@decCol3", d3);
                                cmd.Parameters.AddWithValue("@decCol4", d4);
                                cmd.Parameters.AddWithValue("@intCol", i1);
                                int inserted = cmd.ExecuteNonQuery(); // should be 1
                            }
                        }
                    }
                }
            }
        }
    }
    
    private void InsertList(IEnumerable list)
    {
    String sql=“插入dbo.Table值(@varcharCol、@dateCol、@decCol1、@decCol2、@decCol3、@decCol4、@intCol);”;
    使用(var con=newsqlconnection(Properties.Settings.Default.ConnectionString))
    {
    con.Open();
    foreach(列表中的字符串str)
    {
    String[]fields=str.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries);
    如果(fields.Length==7)
    { 
    DateTime dateCol;
    if(DateTime.TryParseExact(字段[1],“yyyyymmdd”,null,System.Globalization.DateTimeStyles.None,out-dateCol))
    {
    小数点d1、d2、d3、d4;
    int i1;
    if(十进制三分位(字段[2],输出d1)
    &&decimal.TryParse(字段[3],输出d2)
    &&decimal.TryParse(字段[4],输出d3)
    &&decimal.TryParse(字段[5],输出d4)
    &&int.TryParse(字段[6],输出i1))
    {
    使用(var cmd=newsqlcommand(sql,con))
    {
    cmd.Parameters.AddWithValue(“@varcharCol”,字段[0]);
    cmd.Parameters.AddWithValue(“@dateCol”,dateCol);
    cmd.Parameters.AddWithValue(“@decCol1”,d1);
    cmd.Parameters.AddWithValue(“@decCol2”,d2);
    cmd.Parameters.AddWithValue(“@decCol3”,d3);
    cmd.Parameters.AddWithValue(“@decCol4”,d4);
    cmd.Parameters.AddWithValue(“@intCol”,i1);
    int inserted=cmd.ExecuteNonQuery();//应为1
    }
    }
    }
    }
    }
    }
    }
    
    您应该添加日志记录(解析问题)和异常处理(连接问题)

    这种方法还可以轻松添加进度条。因此,您可以使用通过更新
    Progressbar


    下面是一个教程:

    使用ADO.NET,最简单、最安全的方法可能是使用循环:

    private void InsertList(IEnumerable<String> list)
    {
        String sql = "INSERT INTO dbo.Table VALUES(@varcharCol,@dateCol,@decCol1,@decCol2,@decCol3,@decCol4,@intCol);";
        using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
        {
            con.Open();
            foreach (String str in list)
            {
                String[] fields = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                if (fields.Length == 7)
                { 
                    DateTime dateCol;
                    if (DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out dateCol))
                    {
                        decimal d1, d2, d3, d4;
                        int i1;
                        if(decimal.TryParse(fields[2], out d1)
                            && decimal.TryParse(fields[3], out d2)
                            && decimal.TryParse(fields[4], out d3)
                            && decimal.TryParse(fields[5], out d4)
                            && int.TryParse(fields[6], out i1))
                        {
                            using(var cmd = new SqlCommand(sql, con))
                            {
                                cmd.Parameters.AddWithValue("@varcharCol", fields[0]);
                                cmd.Parameters.AddWithValue("@dateCol", dateCol);
                                cmd.Parameters.AddWithValue("@decCol1", d1);
                                cmd.Parameters.AddWithValue("@decCol2", d2);
                                cmd.Parameters.AddWithValue("@decCol3", d3);
                                cmd.Parameters.AddWithValue("@decCol4", d4);
                                cmd.Parameters.AddWithValue("@intCol", i1);
                                int inserted = cmd.ExecuteNonQuery(); // should be 1
                            }
                        }
                    }
                }
            }
        }
    }
    
    private void InsertList(IEnumerable list)
    {
    String sql=“插入dbo.Table值(@varcharCol、@dateCol、@decCol1、@decCol2、@decCol3、@decCol4、@intCol);”;
    使用(var con=newsqlconnection(Properties.Settings.Default.ConnectionString))
    {
    con.Open();
    foreach(列表中的字符串str)
    {
    String[]fields=str.Split(新[]{',},StringSplitOptions.RemoveEmptyEntries);
    如果(fields.Length==7)
    { 
    DateTime dateCol;
    if(DateTime.TryParseExact(字段[1],“yyyyymmdd”,null,System.Globalization.DateTimeStyles.None,out-dateCol))
    {
    小数点d1、d2、d3、d4;
    int i1;
    if(十进制三分位(字段[2],输出d1)
    &&decimal.TryParse(字段[3],输出d2)
    &&decimal.TryParse(字段[4],输出d3)
    &&decimal.TryParse(字段[5],输出d4)
    &&int.TryParse(字段[6],输出i1))
    {
    使用(var cmd=newsqlcommand(sql,con))
    {
    cmd.Parameters.AddWithValue(“@varcharCol”,字段[0]);
    cmd.Parameters.AddWithValue(“@dateCol”,dateCol);
    cmd.Parameters.AddWithValue(“@decCol1”,d1);
    cmd.Parameters.AddWithValue(“@decCol2”,d2);
    cmd.Parameters.AddWithValue(“@decCol3”,d3);
    cmd.Parameters.AddWithValue(“@decCol4”,d4);
    cmd.Parameters.AddWithValue(“@intCol”,i1);
    int inserted=cmd.ExecuteNonQuery();//应为1
    }
    }
    }
    }
    }
    }
    }
    
    您应该添加日志记录(解析问题)和异常处理(连接问题)

    这种方法还可以轻松添加进度条。因此,您可以使用通过更新
    Progressbar


    这里有一个教程:

    我刚刚开始转向实体框架,它大大降低了我的代码复杂性。为此,我通过以下步骤使用实体框架添加了一个新的数据源:

  • 添加新的数据源
  • 在数据源配置向导中,选择数据库
  • 选择实体数据模型
  • 选择“从数据库生成”
  • 创建新连接
  • 选择表并单击finish
  • 编译项目,使对象可供使用,然后在代码中通过以下方式创建访问权限:

    var entity=newdatabaseentity()

    整个
    foreach (string currentrow in buffer) // List<string> buffer - contains csv data
    {
                    // table name is Import
                    dataset.ImportRow row = dataset.Import.NewImportRow();
                    string[] fields = new string[7];
    
                    // Field names
                    // <Nm>,<Date>,<Open>,<High>,<Low>,<Close>,<Vol>
                    fields = currentrow.Split(',');
    
                    // ticker
                    row.Nm = fields[0];
    
                    DateTime data;
                    DateTime.TryParseExact(fields[1], "yyyyMMdd", null, System.Globalization.DateTimeStyles.None, out data);
                    row.Date = data;
    
                    decimal open;
                    Decimal.TryParse(fields[2], out open);
                    row.Open = open;
    
                    decimal high;
                    Decimal.TryParse(fields[3], out high);
                    row.High = high;
    
                    decimal low;
                    Decimal.TryParse(fields[4], out low);
                    row.Low = low;
    
                    decimal close;
                    Decimal.TryParse(fields[5], out close);
                    row.Close = close;
    
                    int vol;
                    Int32.TryParse(fields[6], out vol);
                    row.Vol = vol;
    
                    dataset.Import.AddImportRow(row);
    
                }
    
            importTableAdapter.Update(dataset);
            MessageBox.Show("Done");