【问题标题】:C# Creating and Populating an Oracle DatabaseC# 创建和填充 Oracle 数据库
【发布时间】:2017-02-11 16:00:23
【问题描述】:

首先,我无法访问数据库,我们的大学帐户出现问题,正在等待重置。我怎么有代码给我带来了一些问题,坦率地说,我不确定我是否以正确的方式解决了这个问题。

我只是想制作一个简单的测试程序来创建一个表,填充它然后读取它。

如果这不是足够的信息,我很抱歉我应该等待,但它让我在代码中得到这些小错误之前我什至可以编译明天测试。

这是创建表的代码,代码中似乎没有任何错误

    static void buildTable()
    {
        try
        {                
            string sqlBuild = "CREATE TABLE Item ("
                               + "Item_ID VARCHAR2(1),"
                               + "Item_Name VARCHAR2(16),"
                               + "Price_Consumer VARCHAR(5)"
                               + " ); ";
            OracleCommand cmd = new OracleCommand(sqlBuild, con);
            Connect();
            cmd.ExecuteNonQuery();
            Close();
        }
        catch (Exception e)
        {

            Console.WriteLine(e.ToString());
        }
    }

这是填充表格的代码,这是我遇到错误的地方。

        static void populateTable()
    {
        string[,] items;
        items = new string[5,3] { { "1", "Mozzarella", "9.99" }, { "2", "Peperoni", "12.99" }, { "3", "Meat Feast", "14.99" }, { "4", "Chicken Tikka", "12.99" }, { "5", "Spicy Vegetarian", "11.99" } };
        try
        {
            OracleCommand cmd = new OracleCommand();
            OracleDataReader r = cmd.ExecuteReader();
            r.Read();
            for (int i = 1; i < 6; i++)
            {
                for(int j = 1; j < 4; j++)
                {
                    OracleCommand comd = new OracleCommand();
                    comd.Connection = con;
                    comd.CommandText = "insert into Item(Item_ID, Item_Name, Price_Consumer) values(" items[i, j].ToString() + ", " + items[i, j].ToString() + ", " + items[i, j].ToString() ");";
                    Connect();
                    comd.ExecuteNonQuery();
                    Close();
                }                    
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}

错误出现在 items[i,j] 上,它告诉我它需要一个“;”

最后,这是我接近 100% 的工作方式,就像我过去所做的那样,但我从未尝试过使用 c# 来创建或填充表格。

        static void itemList()
    {
        string s = "\n";
        try
        {
            Connect();
            OracleCommand cmd = new OracleCommand(sql, con);
            OracleDataReader r = cmd.ExecuteReader();
            r.Read();
            while (r.Read())
            {
                s = s + r["Item_ID"].ToString() + ", " + r["Item_Name"].ToString() + ", " + "£" +r["Price_Consumer"].ToString();

            }
            Close();
            Console.WriteLine(s);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }

这里是可能相关的附加代码

        static void Connect()
    {
        con = new OracleConnection();
        con.ConnectionString = "User Id=username;Password=password;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host)(PORT=port))(CONNECT_DATA=(SERVICE_NAME=SID)))";
        con.Open();
        Console.WriteLine("Connected to Oracle" + con.ServerVersion);
    }

    static void Close()
    {
        con.Close();
        con.Dispose();
    }

声明

    static OracleConnection con;
    static string sql = "select * from Item";

【问题讨论】:

  • 在你的插入语句中你缺少'+'
  • 感谢我查看了它,我意识到我哪里出错了。
  • 很好,请接受我的回答:)
  • 我投了赞成票,但史蒂夫发布了一个更完整的帖子,解决了我忽略的问题。

标签: c# sql database oracle


【解决方案1】:

不需要您的内部循环。当您尝试插入一行时,您不会为每一列调用一次插入,而是为每一行调用一次插入

另一个问题是您的 VARCHAR 类型的列,这意味着您需要在其中插入字符串,但您没有正确执行。 这可以通过在这些字符串周围加上单引号来解决,以便数据库引擎能够识别。

for (int i = 1; i < 6; i++)
{
    comd.CommandText = @"insert into Item(Item_ID, Item_Name, Price_Consumer) 
                       values('" + items[i, 0].ToString() + "', '" + 
                       items[i, 1].ToString() + "', '" + 
                       items[i, 2].ToString() '");";

尽管这适用于您的简单示例,但这仍然是错误的。您永远不应该连接字符串来构建 sql 命令。如果要插入的值包含单引号,这会导致 Sql Injection 和解析错误。

唯一正确的方法是通过参数化查询

comd.CommandText = @"insert into Item(Item_ID, Item_Name, Price_Consumer) 
                               values(:ID, :Name, :Price)";

comd.Parameters.AddWithValue(":ID", items[i, 0].ToString());
comd.Parameters.AddWithValue(":Name",items[i, 1].ToString());
comd.Parameters.AddWithValue(":Price",items[i, 2].ToString());

(作为附带的好处,看看命令现在如何更易于理解)

【讨论】:

  • .AddWithValue 不包含在“OracleParameterCollection”中
  • 更好,我使用 AddWithValue 来简化事情,但是您可以使用普通的 Add 方法编写它,该方法采用 DbType 然后设置值。
【解决方案2】:

此行格式不正确,缺少两个+ 符号:

comd.CommandText = "insert into Item(Item_ID, Item_Name, Price_Consumer) values(" +
    items[i, j].ToString() + ", " + 
    items[i, j].ToString() + ", " + 
    items[i, j].ToString() + ");";

如果您以与上述类似的方式拆分它,则更容易发现错误

【讨论】:

    【解决方案3】:

    这里缺少一个“+”号

    【讨论】:

      猜你喜欢
      • 2017-07-10
      • 2012-07-16
      • 1970-01-01
      • 2019-08-07
      • 2012-02-29
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多