【问题标题】:Inserting values into the database brings wrong values将值插入数据库会带来错误的值
【发布时间】:2017-06-23 20:15:36
【问题描述】:

我从互联网上复制了一些代码并对其进行了修改,我有点理解它在做什么,但我无法让它正确地将记录插入数据库。如果我输入“变量的名称”,那么除了在值字段中输入的字面意思外,我似乎什么也得不到,那么这就是我从另一端得到的。一旦我让它工作,它就完成了。

我得到的错误是数据库已打开/或/插入执行命令行号上的变量有问题。

private void button9_Click(object sender, EventArgs e)
{
    try
    {
        string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\temp\\names.accdb;Persist Security Info=False");
        using (OleDbConnection Conn = new OleDbConnection(ConnString))
        {
            Conn.Close();//severl times connection has been open
            Conn.Open();
            DataSet ds = new DataSet();
            ds.ReadXml(@"c:\\temp\\my123.xml");
            OleDbCommand cmd = new OleDbCommand();
            OleDbCommand cmd1 = new OleDbCommand();
            DataTable dtCSV = new DataTable();
            dtCSV = ds.Tables[0];              
            cmd.Connection = Conn;
            cmd.CommandType = CommandType.Text;
            cmd1.Connection = Conn;
            cmd1.CommandType = CommandType.Text;

            Conn.Open();

            for (int row = 0; row <= dtCSV.Rows.Count - 1; row++)
            {
                for (int col = 1; col <= dtCSV.Columns.Count - 1; col++)
                {
                    cmd.CommandText= ("INSERT INTO  tab1 ( field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)");
                    cmd.ExecuteNonQuery();
                }
            }
            Conn.Close();
        }
    }
    catch (Exception ex)
    {
        richTextBox1.Text = richTextBox1.Text + "\n Error " + ex + "\n"; ;
    }
}

错误 System.InvalidOperationException:连接不正确 关闭。连接的当前状态是打开的。在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnection(DbConnection 外部连接,DbConnectionFactory 连接工厂, TaskCompletionSource`1 重试,DbConnectionOptions userOptions) 在 System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection 外部连接,DbConnectionFactory 连接工厂)在 System.Data.OleDb.OleDbConnection.Open() 在 WindowsFormsApp5.Form1.button9_Click(Object sender, EventArgs e)

【问题讨论】:

  • 当您在 Connection 周围使用 using 语句时,该连接实例会在您退出 using 块时自动关闭。您不需要在第二个按钮单击中关闭任何内容
  • @Steve 我无法理解数据库仍然处于打开状态,即使现在重新启动后@C Perkins 你能帮忙
  • 你的意思是数据库还在打开?您在 using 块内创建一个连接。在您调用 Open 之前,该连接不会打开。所以没有 conn.Close 作为 using 块内的第一行,你也不需要 conn.Close 在最后,因为 using 块在到达结束大括号时关闭并释放连接。
  • 您打开连接两次,其余的,您的插入语句看起来有点“有趣”,我不确定您期望该语句的输出是什么,所以当您摆脱当前错误下一个将在 cmd.ExecuteNonQuery() 期间出现。另外,&lt;= value - 1 == &lt; value 不要让它变得过于复杂
  • ... 而且这里的任何地方都没有使用 cmd1

标签: c# database winforms


【解决方案1】:

您在连接对象上调用Open() 函数两次,如下面的代码块所示。所以本质上,您试图在连接状态仍为 Open 时打开连接,而这正是错误所说的

        Conn.Open();      <--- Here
        DataSet ds = new DataSet();
        ds.ReadXml(@"c:\\temp\\my123.xml");
        OleDbCommand cmd = new OleDbCommand();
        OleDbCommand cmd1 = new OleDbCommand();
        DataTable dtCSV = new DataTable();
        dtCSV = ds.Tables[0];              
        cmd.Connection = Conn;
        cmd.CommandType = CommandType.Text;
        cmd1.Connection = Conn;
        cmd1.CommandType = CommandType.Text;

        Conn.Open();     <--- Here

正如@Steve 所说,cmd1 从未使用过,看起来就像附加到相同的命令文本。

此外,您的 INSERT 查询永远不会以所需的方式工作,因为您实际上并没有替换这些值

"INSERT INTO  tab1 ( field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)"

你应该是这样的

string.Format("INSERT INTO  tab1 ( field1, field2) VALUES ({0} ,{1})", dtCSV.Rows[row] ,dtCSV.Columns[col])

(或者)如果你使用的是 C#6,那么你可以说

$"INSERT INTO  tab1 ( field1, field2) VALUES ({dtCSV.Rows[row]} ,{dtCSV.Columns[col]})"

【讨论】:

  • 这个问题还有很多好东西,不要停在这里;)
  • @Icepickle,所有的好东西... codereview.stackexchange.com :)
  • 嗯,我不知道,这不是应该得到审查的working coding 吗? :)
  • 删除后我得到“没有为一个或多个必需参数提供值。”
  • 酷,你能告诉他参数是什么吗? :) 以错误的方式纠正问题对我来说听起来像是一个新问题;)
【解决方案2】:
private void button9_Click(object sender, EventArgs e)
{
    try
    {
        string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\temp\\names.accdb;Persist Security Info=False");
        using (OleDbConnection Conn = new OleDbConnection(ConnString))
        {
            //Conn.Close();//severl times connection has been open
            Conn.Open();
            DataSet ds = new DataSet();
            ds.ReadXml(@"c:\\temp\\my123.xml");
            OleDbCommand cmd = new OleDbCommand();
            //OleDbCommand cmd1 = new OleDbCommand();
            DataTable dtCSV = new DataTable();
            dtCSV = ds.Tables[0];
            cmd.Connection = Conn;
            cmd.CommandType = CommandType.Text;
            //cmd1.Connection = Conn;
            //cmd1.CommandType = CommandType.Text;

            //Conn.Open();

            for (int row = 0; row <= dtCSV.Rows.Count - 1; row++)
            {
                //for (int col = 0; col < dtCSV.Columns.Count - 1; col++)
                //{
                //    //cmd.CommandText = ("INSERT INTO  tab1 ( field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)");
                //}
                cmd.Parameters.Clear();
                if (dtCSV.Columns.Count > 1)
                {
                    cmd.Parameters.Add(dtCSV.Rows[row][0].ToString());
                    cmd.Parameters.Add(dtCSV.Rows[row][1].ToString());

                    cmd.CommandText = ("INSERT INTO  tab1 ( field1, field2) VALUES (? , ?)");
                    cmd.ExecuteNonQuery();
                }

            }

            //Conn.Close();
        }
    }
    catch (Exception ex)
    {
        richTextBox1.Text = richTextBox1.Text + "\n Error " + ex + "\n"; ;
    }
}

你可以使用它。希望对你有帮助。

【讨论】:

  • 错误 System.InvalidCastException:OleDbParameterCollection 仅接受 cmd.Parameters.Add(dtCSV.Rows[row][0].ToString()) 行上的非空 OleDbParameter 类型;感谢您的努力,这是我正在寻找的@Tien Nguyen
  • 错误 System.InvalidCastException:OleDbParameterCollection 仅接受非空 OleDbParameter 类型对象,而不接受 String 对象。在 System.Data.OleDb.OleDbParameterCollection.ValidateType(Object value) 在 System.Data.OleDb.OleDbParameterCollection.Add(Object value) @TienNguyen Iuse Visual Studio 2017
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 2021-09-01
  • 2016-12-25
  • 1970-01-01
  • 2019-10-11
  • 2012-09-10
相关资源
最近更新 更多