要开始我无法访问数据库,我们遇到了大学帐户的问题并等待重置。我怎么会有代码给我一些问题,坦率地说,我不确定我是否以正确的方式解决了这个问题。
我只是想制作一个简单的测试程序来创建一个表,填充它然后读取它。
如果这不是足够的信息,我很抱歉我应该等待,但它在我甚至达到我可以编译测试明确的点之前在代码中得到这些小错误。
以下是创建表的代码,代码中似乎没有任何错误
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());
}
}
}
错误在项目[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";
答案 0 :(得分:2)
不需要内部循环。当您尝试插入行时,不会为每列调用插入一次,但是为每行调用插入一次
另一个问题是你的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());
(作为附带好处,请看看命令现在更容易理解)
答案 1 :(得分:1)
此行格式不正确,缺少两个+
符号:
comd.CommandText = "insert into Item(Item_ID, Item_Name, Price_Consumer) values(" +
items[i, j].ToString() + ", " +
items[i, j].ToString() + ", " +
items[i, j].ToString() + ");";
如果以与上述类似的方式拆分它,则更容易发现错误
答案 2 :(得分:1)