1-テーブルに列を追加するためのコマンドを実行 エラー選択欄は最近
2- Oracle.DataAccess
を使用してOracle XEに接続ODP.NETのALTER TABLEが挿入します;3- DataReaderオブジェクトを使用してこのコラム
、4-読み取りを選択するためのコマンドを実行します。アプリケーションは、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()'メソッドは役に立ちますか? –
私は、列を追加した後、選択する前にPurgeStatementCacheを試しましたが、機能しませんでした。 – rkawano
'OracleTransaction'は廃棄されるべきで、それ自身の' using'ブロックを持つべきです。 ['OracleCommand.CreateCommand'](http://docs.oracle.com/html/B28089_01/OracleConnectionClass.htm#i1001011)を使用することもできます。これにより、コマンドを自分自身に割り当てる必要がなくなります。 – WhiteKnight