1-使用Oracle.DataAccess錯誤選擇欄最近與ALTER TABLE插入ODP.NET
2-執行一個命令將列添加到表連接到的Oracle XE:改變表TABLE添加塔B INT ;
3-執行命令以選擇此列
4-使用DataReader讀取。應用程序引發IndexOutOfRangeException:無法找到結果指定列設置
5重新啓動應用程序,查詢可以正常運行
DataReader的,爲什麼不能訪問我創建剛纔列?
這裏是一個大而簡單的代碼來測試:
private void button1_Click(object sender, EventArgs e)
{
using (OracleConnection con = new OracleConnection(Settings.Default.CS))
{
con.Open();
try
{
using (OracleCommand com = new OracleCommand())
{
com.Connection = con;
// Create a test table
com.CommandText = "CREATE TABLE Test (a int)";
com.ExecuteNonQuery();
// Add one column
com.CommandText = "ALTER TABLE Test ADD b int";
com.ExecuteNonQuery();
com.CommandText = "SELECT * FROM Test";
using (DbDataReader dr = com.ExecuteReader())
{
MessageBox.Show(dr.FieldCount.ToString());
// Here is showing "2", thats ok
}
}
}
finally
{
con.Close();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
using (OracleConnection con = new OracleConnection(Settings.Default.CS))
{
con.Open();
try
{
using (OracleCommand com = new OracleCommand())
{
OracleTransaction trans = con.BeginTransaction();
try
{
// Add a column to table already created
com.Connection = con;
com.CommandText = "ALTER TABLE Test ADD c int";
com.ExecuteNonQuery();
// Insert a value, ok
com.CommandText = "INSERT INTO TEST (a, b, c) VALUES (1, 2, 3)";
com.ExecuteNonQuery();
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
// Selecting only "c" column
com.CommandText = "SELECT c FROM Test";
using (DbDataReader dr = com.ExecuteReader())
{
if (dr.Read())
MessageBox.Show(Convert.ToInt32(dr["c"]).ToString());
// Showing correct value, ok
}
// Uncomment these lines to solve problem
//con.Close();
//OracleConnection.ClearAllPools();
//con.Open();
// Selecting all fields * from table
com.CommandText = "SELECT * FROM Test";
using (DbDataReader dr = com.ExecuteReader())
{
MessageBox.Show(dr.GetSchemaTable().Rows.Count.ToString() + "/" + dr.FieldCount.ToString());
// HERE IS THE PROBLEM: message are showing 2/2, but table haves 3 fields
if (dr.Read())
MessageBox.Show(Convert.ToInt32(dr["c"]).ToString());
// Here throws IndexOutOfRangeException: Unable to find specified column in result set
}
}
}
finally
{
con.Close();
}
}
}
對我來說,這聽起來像某種元數據緩存。也許 'OracleConnection.PurgeStatementCache()'方法可以幫助嗎? – 2012-04-17 21:15:46
我在添加列之後嘗試了PurgeStatementCache,然後再選擇,但沒有奏效。 – rkawano 2012-04-18 12:36:37
'OracleTransaction'應該被丟棄,所以應該有它自己的'using'塊。您可以選擇使用['OracleCommand.CreateCommand'](http://docs.oracle.com/html/B28089_01/OracleConnectionClass.htm#i1001011),因爲這樣可以節省您需要自行將連接分配給命令。 – WhiteKnight 2012-04-18 20:26:00