列出<t>到数据库然后再返回</t>

时间:2012-04-02 16:23:07

标签: c# database list ado.net bulkinsert

所以我试着将我的列表写入数据库并且我有一些问题。首先,似乎没有任何东西被保存到数据库中,但是没有任何错误会导致崩溃,我知道这段代码在过去对我有效:

    public void saveToDb(int var1, string var2)
    {
        SqlCommand cmd = new SqlCommand("Insert into [table] (col1, col2) VALUES (@param1, @param2)", conn);

        cmd.Parameters.AddWithValue("@param1", var1);
        cmd.Parameters.AddWithValue("@param2", var2);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    }

我有一个三层图层,ui,逻辑和DAL。首先它没有使用数据库和DAL类库中的app.config文件,所以它们被移动到主类库,现在它不抱怨已存在的数据库,它找到我的连接字符串。

要以这种方式将数据发送到此方法:

    for (int i = 0; i < myList.Count; i++)
        {
            da.saveToDb(myList.val1, myList.val2);
        }

它没有在代码中给我一个错误,但是当我停止程序时似乎没有保存或重置但我不知道哪个但是我可以通过在执行插入之前打印它们来正确传递变量所以我猜Db被重置了?它是否将我的数据库放入调试文件夹并每次刷新它或什么?

另一件事是我上次这样做它是一个表单所以总是一次只有一个插入,现在我的对象列表可以包含从1到很多对象的任何地方,这样我会为列表中的每个对象打开和关闭一次数据库连接对吗?你如何做批量插入?一直在阅读关于数据集的内容,但它们似乎都是关于从数据库中读取而不是写作,所以我不确定。我确实使用数据集和适配器从另一个项目中的数据库中读取,因此不应该是一个问题,但如何批量发送列表到表中?为了让它变得更加棘手我不能只转换整个列表,因为10个属性8将进入一个表,剩下的2将进入第二个表,所以我需要循环它们并将相应的属性添加到相应的数据集(或您使用的)。

修改

嗯,我现在做了一些调整,我尝试了两种方法,但没有一种方法可行,但都没有给出任何令人沮丧的错误。

第一种方法:

    public void saveToDb(int val1, string val2)
    {
        SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString);
        SqlCommand cmd = new SqlCommand("Insert into [table] (val1, val2) VALUES (@param1, @param2)", conn);

        cmd.Parameters.AddWithValue("@param1", val1);
        cmd.Parameters.AddWithValue("@param2", val2);
        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
        cmd.Connection.Close();
    }

第二次我尝试sqlbulkcopy一个表:

    public void SaveToDb()
    {

        using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["[MyConnectionString]"].ConnectionString))
        {
            conn.Open();

            using (SqlBulkCopy bulk = new SqlBulkCopy(conn))
            {
                bulk.ColumnMappings.Add("col1", "col1");
                bulk.ColumnMappings.Add("col2", "col1");
                bulk.DestinationTableName = "[table]";

                System.Diagnostics.Debug.Print("Open");
                bulk.WriteToServer(tab);
                foreach (DataRow row in tab.Rows)
                {
                    foreach (var item in row.ItemArray)
                    {
                        System.Diagnostics.Debug.Print(item.ToString());
                    }
                }
                System.Diagnostics.Debug.Print("sending");
            }
            System.Diagnostics.Debug.Print("closing");
        }
    }

我不应该映射它,因为该表包含与具有相同命名(大写/小写)的表完全相同的列但是它与主键增加很奇怪,所以我映射它所以它应该添加增量自动但没有插入任何内容,打印确定显示值,但如果我注释掉映射我得到一个错误说无法分配null(这是真的我的表不会取空值)但值不应该为null,因为它在那里桌子?

2 个答案:

答案 0 :(得分:3)

好像你忘记了索引。

for (int i = 0; i < myList.Count; i++)
    {
        da.saveToDb(myList[i].val1, myList[i].val2);
    }

答案 1 :(得分:0)

我认为你错过了连接对象。 var cn = new SqlConnection()。 然后在连接对象上调用open。

connection.command将授予对命令对象的访问权限。