@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

C#のDataBaseの操作について

投稿者投稿内容
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-11-23 18:51
msoです。

分からないことがあるので何かアドバイスをいただきたいです。


コード:
	public class ConnectionDatabase2
	{

		static OleDbConnection cn;
		static OleDbDataAdapter da;
		static DataTable tbl;

		public ConnectionDatabase2()
		{
			// 
			// TODO: コンストラクタ ロジックをここに追加してください。
			//
			
		}

		/// <summary>
		///  メインメソッド
		/// </summary>
		public void MianMethod()
		{
			string strConn ,strSql;
			strConn = "user id=user;"
				+ "password=pass;"
				+ "initial catalog=hogeDB;"
				+ "data source=192.168.1.3;"
				+ "Provider=SQLOLEDB;"
				+ "Trusted_Connection=Yes;"
				;
			strSql = "SELECT OrderID,ProductID,Quantity,UnitPrice FROM OrderDetails WHERE OrderID = 10503 ORDER BY ProductID" ;

			cn = new OleDbConnection(strConn);
			da = new OleDbDataAdapter(strSql,cn);
			tbl = GenTable();

			cn.Open();
			ResetOrder();

		}

		#region "初期化処理"
		/// <summary>
		/// 初期化処理
		/// </summary>
		static void ResetOrder()
		{
			OleDbCommand cmd = cn.CreateCommand();
			cmd.CommandText = "DELETE FROM OrderDetails WHERE OrderID = 10503";
			cmd.ExecuteNonQuery();

			cmd.CommandText = "INSERT INTO OrderDetails(OrderID,ProductID,Quantity,UnitPrice) VALUES (10503,14,70,23.25)";
			cmd.ExecuteNonQuery();

			cmd.CommandText = "INSERT INTO OrderDetails(OrderID,ProductID,Quantity,UnitPrice) VALUES (10503,65,20,21.05)";
			cmd.ExecuteNonQuery();
		}
		#endregion

		#region "Define"
		/// <summary>
		/// テーブル定義
		/// </summary>
		/// <returns></returns>
		static DataTable GenTable()
		{
			DataTable tbl = new DataTable("Order Details");
			DataColumn col;

			col = tbl.Columns.Add("OrderID",typeof(int));
			col.AllowDBNull = false;

			col = tbl.Columns.Add("ProductID",typeof(int));
			col.AllowDBNull = false;

			col = tbl.Columns.Add("Quantity",typeof(Int16));
			col.AllowDBNull = false;

			col = tbl.Columns.Add("UnitPrice",typeof(Decimal));
			col.AllowDBNull = false;

			tbl.PrimaryKey = new DataColumn[] {tbl.Columns["OrderID"],tbl.Columns["ProductID"]};

			return tbl;
		}
		#endregion

	}



上記のプログラムを実行したときに
コード:
	OleDbCommand cmd = cn.CreateCommand();
	cmd.CommandText = "DELETE FROM OrderDetails WHERE OrderID = 10503";
	cmd.ExecuteNonQuery();


の部分(cmd.ExecuteNonQuery();)でエラーが発生します。


エラーの内容は
'System.Data.OleDb.OleDbException' のハンドルされていない例外が system.data.dll で発生しました。

というものです。
本を参考に作っているのですが、何がおかしいのかよくわからない
状態です。
おかしいところがあるとおもうのですがアドバイスをいただけないでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-23 19:12
 処理の流れはどうなっていますか?処理の流れを追って、インスタンスが生成されているか、確認しましょう。ってことだと思うのですが。
 また、エラーの内容も、もう少し詳しいメッセージがあると思うのですが?
_________________
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-11-23 19:29
引用:

Jittaさんの書き込み (2004-11-23 19:12) より:
 処理の流れはどうなっていますか?処理の流れを追って、インスタンスが生成されているか、確認しましょう。ってことだと思うのですが。
 また、エラーの内容も、もう少し詳しいメッセージがあると思うのですが?




ご指摘ありがとうございます。
Try〜Catchでエラーをとったところ
オブジェクト名 'OrderDetails' は無効です。
というエラーを取得することが出来ました。

Osqlで接続をして、
DELETE FROM OrderDetails WHERE OrderID = 10503
を実行したときはそのまま動作したのですが何か
おかしいみたいです。

もうちょっと考えてみたいと思います。
何かあればまたアドバイスをお願いします
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2004-11-23 19:54
つながらないということは
initial catalog=hogeDB;
が間違っているんじゃありませんか?
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-11-23 21:19
msoです。

hogeDBというデータベースは存在するのは確認できました。
個人的には権限のもんだいかと思い、
grant all to user
というような形で権限を与えてみたのですが、
ダメでした。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-23 22:02
引用:

msoさんの書き込み (2004-11-23 19:29) より:

ご指摘ありがとうございます。
Try〜Catchでエラーをとったところ
オブジェクト名 'OrderDetails' は無効です。
というエラーを取得することが出来ました。

Osqlで接続をして、
DELETE FROM OrderDetails WHERE OrderID = 10503
を実行したときはそのまま動作したのですが何か
おかしいみたいです。


 SQL Serverで、大文字小文字の判別はしないと思うのですが、どうでしょうか?えっと、引用符で囲った場合はする、囲わない場合はしない、ということで。で、エラー文中に小文字??私のメインはOracleなのですが、Oracleでは引用符で囲っているのでエラー、と言えるのですが、SQL Serverの場合はどうなんでしょう?

 あとは、繋がっているユーザが違うとか(テーブルが見えていない)、繋がっているデータベースが違うとか???

_________________
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2004-11-23 22:04
msoです。

その後もいろいろとやっていたのですが、
1つ気が付いたことがあります。


OleDbConnectionを使って接続するしたときは正しく動作しなかったのですが、
SqlConnectionを使って接続をすると正しく動作をするようになりました。

OleDbConnectionで接続できなかった理由はOLEDB(ODBC)の設定を
してなかったためでしょうか?


未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2004-11-23 22:58
hogeDB ってもしかして Northwind サンプルデータベースのコピーじゃないですか?
だとしたら、OrderDetails ではなく Order Details のはず。とりあえず、テーブル名をかぎ括弧でくくって [Order Details] としてみたらどうですか?

スキルアップ/キャリアアップ(JOB@IT)