ADO.NETの質問・雑談スレ2
ADO.NETに関する質問・雑談・評価 etc 何でもどうぞ。 前スレ ADO.NETの質問・雑談スレ http://pc11.2ch.net/test/read.cgi/db/1104630889/ 以下のスレから誘導されてきました。 http://pc11.2ch.net/test/read.cgi/db/1234077152/ 先のスレでも回答いただいたのですが、どうやら私の理解が不足している様でして 出来れば初心者にも判りやすく回答いただけないでしょうか。 質問の内容はこの通りです。 環境はVS2008pro C# SQLServer2005EEです。 SQL分でLIKE抽出するときなのですが、%っていうのは「なくても」or「何が何文字あっても」って感じですか? ワイルドカード文字数を指定してLIKE抽出したい場合*を使うのでしょうか? 又、*は「とりあえず何らかの文字が1文字以上ある」なのでしょうか? やりたいことは (0は何らかの数字/A,Bはアルファベットが入ります) 000A000 000B000 000A000B 000B000A の中から4文字目にBがくるものだけ抽出したいのです。 LIKE %B% では000A000Bも拾ってしまいます。 この場合*B*でいいのでしょうか? (正規表現も試しましたがかなり遅い感じを受けましたので出来れば避けたいです) よろしくお願いいたします。 一文字ワイルドカードは_だと教えて頂きましたが、___B%ではまるで抽出できませんでした LINQ使えば、もうADO.NETは不要という時代になってきたのかな・・・ 頑張ってLinq使ってるけど一長一短て感じだなー。 補完的に使うと便利だけど完全にADO.NETを置き換えられるか、つーと色々微妙。 取得結果を1カラムずつループ、とか出来ないし。 Linq to SQLもEntity Frameworkも基本的にORMだから、 他のORMと同じような長所と短所を持っている。 完全な代替にはならない。 <<質問>> 当方の環境ではLike演算子の挙動が1)SqlSeverManagementStudio と 2)ADO.NET(VS2008C#)で異なっているのですが、 原因が解らずはまっております。なんでこんな事がおきるのでしょうか・・・ <<やりたいこと>> XXXA0001のようなデータを抽出したい select max(xxxx) from xxxxx where cd like 'XXX[AB][0-9][0-9][0-9][0-9]%' <<現象>> XXXA0001とか 1)ではヒットするのだが、 2)ではヒットしない <<試行錯誤結果>> 2)では [0-9]の数が1つまでなら、なぜかヒットする ×where cd like 'XXX[AB][0-9][0-9][0-9][0-9]%' ×where cd like 'XXX[AB][0-9][0-9]01%' ×where cd like 'XXX[AB][0-9]0[0-9]1%' ○where cd like 'XXX[AB][0-9]001%' ○where cd like 'XXX[AB]0[0-9]01%' ○where cd like 'XXX[AB]00[0-9]1%' ○where cd like 'XXX[AB]000[0-9]%' >>306 System.Data.SqlClient.qlCommandでは2)は1)と同じ動作になる。 前提条件や再現するソースくらい出しなよ。 likeの後の文字列が途中で切れてると神の啓示があったぞ >>307-309 レス頂き有り難う御座います。 また、中途半端な情報しか出せずに申し訳ありません。 2)の実行環境ですが、プロジェクトにデータセット(XSDファイル)を追加し、 同デザイナ上でクエリ追加()、SQLは306に記述されている構文そのまま(Scalar) になります。 尚、接続先はSqlServer2008Expressになります。 接続文字列は Data Source=XXXXXX\SQLEXPRESS;Initial Catalog=XXXXXXXXX;Persist Security Info=True;User ID=xxxx,Password=xxxx になります。 自分自身DBは1年に数回いじる程度のスキルしか持ち合わせていないため、 何か間違いを犯しているような気はしているのですが、それが特定出来ていないのが現状です。 >>309 パラメータ文字列長に上限値が存在するということでしょうか? 本当に調査したいのならSQLServreProfilerでどんなSQLが発行されたか調べればいい。 >>311 ,312さまレス有り難う御座います。 306で御座います。原因がわかりました。 結論から言えば、309様の神のお告げのとおりで御座いました。 テーブルのフィールドの型がchar(16)で定義されているため、 デザイナでコード生成をすると対応するテーブルアダプタ\コマンド\パラメータの型も char(16)として扱ってしまい、結果として、意図したパラメータが入力されなくなっておりました。 その為、like演算子を用いるパラメータクラスのプロパティ(ProvideType)を Varchar型に変更することで解決することが確認できました。 >>311 さま 実行されたSqlをトレースするソフトがあるなんて知りませんでしたw 同ツールを用いることで、解決にこぎつけました。 >>その他の皆様 私自身DBをよくわかっていないため、的確な情報が出せずに、申し訳ありません。 質問に反応して頂き有り難う御座いました。助かりました!! read_commitedでのinsertでデッドロックすることがあるんですが、そういうものですか? insertでなぜおきるのかわかりません だれかが、インサートしようとしたテーブルに対して、何らかのロックを獲得してたんだろう つか、それほんとにデッドロックか? insertでのロックで考えられるのは索引に対するもの。 カーディナリティの低い索引で広範囲のロックがかかりやすい。 データセットのxscファイルがなんのためにあるのかわからん。 教えてエロい人 yorapaa@yahoo.co.jp, このアドに メールしてくれ データベースの更新に失敗してロールバックが発生した場合、 データテーブルのRowStateとか更新中に取得した自動採番値を更新前の状態に戻す処理はどうしてますか? AcceptChangesDuringUpdateをfalseにしてもRowStateが更新されちゃったり(MySqlConnecter.net) ロールバック時のdatatableのロールバック処理に試行錯誤中です・・・ Transactionつかうんじゃないの? もう少し状況を詳しくお願いします。 >>324 環境はC#2005で、MySqlConnector/Netを使用しています。 処理は以下です。 AcceptChangesDuringUpdateはfalse //Update時にAcceptChangesが実行されないはず try { トランザクション開始 mysqldataadapter.Update(datatable) ← RowUpdatedイベントで自動採番やタイムスタンプの値取得 コミット datatable.AcceptChanges(); } catch (sqlexception) { ロールバック ← このときにデータテーブルの値をUpdate前の状態に戻したい } AcceptChanges()していないのにRowStateが更新されてしまう事と、 Updateが成功したDataRowのタイムスタンプの値をUpdate前の値に戻す処理の実装 をどうすれば良いのかで悩んでいます。 >>325 con.Open(); try { var trans = connection.BeginTrans(); adapter.transaction = trans; adapter.Fill(table); trans.Commit(); } carch { con.Rollback(); } con.Close(); DataAdapter.Fillとかで、すこし時間がかかる場合 検索中ですみたいなメッセージを出したいけど、 マルチスレッドにするしかないのかな。難しそうだな 素直にそのコードの前にマウスポインタを砂時計にするべきじゃないの? そしてタイムアウト時の処理を忘れて 砂時計のままになるんですね、、、 砂時計にしたって、処理待の状態は変わらないんじゃ、、、 BeginInvokeでも使っとれ 型付DataSet、型なしDataSet、ドラッグ&ドロップで生成、SqlCommand… ADO.NETってどう使えばいいのかサッパリわからん。 どうすれば一番楽にアプリを作れるの? なんか1冊いい本教えて。 作りたいのはデスクトップアプリでよくある業務系システム。 >>332 だったら、GUI(デザイナーなど)上でオブジェクトを配置しない方法を使った方が良いんでね? 他のプログラミング言語とかで、DB接続やるのになるべく近い方法にすれば、イメージもしやすい。 GUI(デザイナー)やウィザードは、それらの労力を省力化する為の便利機能なのだから。 俺が使っていた書籍は、 Visual Basic 2005による [実践]データベースプログラミング 谷尻 かおり (著) だけど、公式図書は手元においていた方がいいと思うよ。結構な値段するけど。 >>333 Visual Basic 2005による [実践]データベースプログラミング かなり後悔した1冊だったわ・・・ >>334 具体的にどこが? 俺はこの一つ前のバージョンの書籍を買ったが、 説明がウィザードのオンパレードで終わっていて、 後悔している。 ひと目でわかるMicrosoft Visual Basic 2008 データベース開発入門の方がいいな コレを基礎に複雑なフォームとか作れるようになった 内容はゴク初歩的だけどな 数十万件のデータを更新するとTableAdapter.Updateの処理に約30秒程掛るのですが、 その間、フォームが応答なし状態になってしまいます。 ちゃんと処理は行われているので待っていれば復帰するのですが、 できればDoEventsみたいに処理を受け付けるようにしたいのです。 そのような方法はありますでしょうか? スレッドを使う。backgroundWorkerなど データテーブル作成時に計算結果を表示する列を追加したい。 現在、社員データテーブルの一覧をそのままDataGridViewに表示しています。 DataGridViewに年齢カラムを追加しています。 社員データテーブルの生年月日フィールドの値を用いて年齢を表示させたいと思っています。 現在は、DataGridViewと社員データテーブルをバインドし、 Form_Loadで、TableAdapetr.Fill(社員DataTable)を行ったあと、 DataGridViewの行数だけ For 〜 Next でループして1行ずつ年齢を計算して DataGridViewのセルにセットしています。 効率が悪い感じがしているので、できれば社員DataTableを作成する時点で 自動的に年齢が代入された社員DataTableを作成するか、 もしくはバインドされたDataGridViewに値がセットされるときに自動で 年齢がセルに入るような感じにしたいのですが、わかりません。 ちなみに年齢の計算式は以下です。(インターネットで探してきました) ((Integer.Parse(今日yyyyMMdd) - Integer.Parse(生年月日yyyyMMdd)) / 10000).ToString("##0") うまい方法を教えて頂ければと思います。 環境:VB.NETかC# DB:ACCESSかSQLServer 自己解決致しました。 ACCESSでいろいろやっていたところSQL文の中にかなり関数を入れることが可能でした。 以下のSQL文で年齢を含んだデータテーブルを作成することができました。 有難う御座いました。 SELECT ID, 生年月日, Format((Format(Now(),'yyyymmdd') - Format(生年月日,'yyyymmdd')) / 10000, '#0') AS 年齢 FROM 社員テーブル ちょっと教えてください! 今、VB2010からADO接続でAccess2007のデータ管理するシステム作ってるんだけど、 Accessで添付ファイル型フィールドにJPEGかBMPのファイルを記録して、それをADOで抽出したいのです。 その時の抽出方法としてDatasetを使用するんですが、このDatasetからどうやって添付ファイル型のデータを抜き取ればいいんでしょう? DataSet.Tables("テーブル名").Rows(0)("フィールド名") この構文のあとに何かつけるとか?? >>342 かなり亀レスだけど、このスレは人が少ないから、 プログラム板のVB関連スレでも同じ質問をしてみると いいと思う。 その結果をここで紹介してくれるとなおよろし。 俺の経験談だが、 ADO.NETに関する質問は、プログラム板のVB質問スレでも 丁寧な回答がつく事が多い。 今のVB.NET質問スレにはDB詳しい人おらんようだで ム板で見つけた関連スレを貼っておきます。 データベースプログラミング全般スレ http://hibari.2ch.net/test/read.cgi/tech/1097295557/l50 このスレッドも、DB関連話題という枠組みよりも、プログラムとして どうなのかという話題にする意味合いで、板を移ったほうがいいかもね。 テーブルアダプタの連想配列みたいなことを実現する方法はありますか? イメージとしては Using ta as New myDataAdapters(DataSetName) Dim dt as DataTable ta.Tables(TableName).fill dt.Rows(0)(TargetColumnName)="hoge" ta.Update(dt) End Using こんな感じで ta.Tables(TableName).fill じゃなくて ta.Tables(dt,TableName).fill もしくは dt=ta.Tables(TableName).GetData() こうか 多分基本的なことなんだろうと思うんですが どう調べたらいいのかわからないので教えてください ADO.NET+OLEDBでaccessに接続するときのSQL構文は MDBファイルをAccessで開いて「クエリ」で入力するものと違いますよね (例えばワイルドカードが*と%) この構文は具体的には何の構文になるのでしょうか? ADO.NET固有のものなのかOLEDB固有のものなのかもよくわからないし 詳細はどこに載っているのですか? また、executeNonQuery等を実行する直前のsql文をDebug.printして それをAccessのクエリで動かすと普通に動くのに コード経由ではエラーになったりすることがあって困ってます コード経由で実行されるのと同じ構文で SQLの動作かチェック出来るようなツールが Visual Studioとかに付属しているとデバッグしやすいのですが そういうのはあったりしますか? >>351 > MDBファイルをAccessで開いて「クエリ」で入力するものと違いますよね 何故そう思った >>351 > コード経由ではエラーになったりすることがあって困ってます エラーになったりしない。 そもそもSQLが悪いのか? >>352 実際にMDBファイルをAccessで開いて クエリ→SQLビューでコピペしてちゃんとINSERT文が動くからです。 ttp://msdn.microsoft.com/ja-jp/library/ms187442.aspx ttp://msdn.microsoft.com/ja-jp/library/ms189086%28v=sql.90%29.aspx この辺とかが該当するのかな、とも思ったのですが 後述するようにここは関係なくて、ANSI構文というのが該当するのかもしれません そういう辺りの話は何を見れば載っているのかよくわからんです >>353 今回エラーになっていた箇所は「Image」が 予約語になっていたのが原因で、[Image]とすることで回避出来ました ただ、これは、Accessの予約語ではないです(使用しているバージョンは2002) ttp://support.microsoft.com/kb/286335/ja 実際、MDBを開いてクエリ実行した場合は[]を付けずにちゃんと登録出来ます プログラムからは、[]つきじゃないと動きません もうちょっとググって辿りついたのがこれ(Imageが予約語に含まれている)。 ttp://support.microsoft.com/kb/248738/ja そうだとするとOLEDBとかは関係なくて JET&ANSI構文の話になるのかな? 解決、ここにありましたわ ttp://en.w3support.net/index.php?db=so&id=719115 ADOはデフォルトでSQL92準拠の構文 AccessはデフォルトでSQL89準拠の構文+一部準拠してない(VBのワイルドカード) 特にAccess2000はSQL89しか対応していない また、mdbの設定でモードを変更出来る ということでした VS2005のデータアダプターの同時実行制御オプションONで 生成されるUpdateクエリのWHERE句は、 全列チェックではなく、SELECTで選択した列だけチェックされていますが、 これは、複数のユーザが同じクエリ(選択列)を実行した場合はOKだけど、 そうでない場合はNGじゃない。 EPI使ってるやついる? ActiveRecordでinsert時のkey取得するのってどうやるの? あと、QPEの接続パラメーター教えて 質問があります。 以下のテーブルをDataAdapterで更新します。 変更前のテーブル ID DATA 1 晴れ 2 曇り 変更後のテーブル ID DATA 2 晴れ 1 曇り IDは主キーに設定してあります。 この場合一意制約違反のエラーが起こります。 DataAdapterを使った更新方法で回避する方法はありますか? >>359 1 曇り 2 晴れ UPDATEすればいいだろ >>360 回答ありがとうございます。 質問はテーブルを単純に書きましたがUPDATE以外にINSERTとDLEATEも同時にやりたいので、 DataAdapterを使用しています。 ID部分の入れ替え動作中に一意制約違反になってしまうので、どうにか回避出来る方法がないか探してます。 >>361 仮に ID の最大値が 99 なら、 100足して、100引いたら、どうだべ。 DataAdapter使ってんなら、ID以外の部分を入れ替えればいいだろ IDを書き換えるって発想がまずおかしい IDを書き換えてダブったらエラーになるのは当然で DataAdapterでどうこうするような話じゃないと思うが UPDATEするのやめて、変更行はDELETEしてINSERTするようにすれば? >>364 DataRowに元テーブルの情報まで入っちまってるんで元情報を取っておくことが出来ない やるとするとInsert用のRowを新規作成して元Rowからカラムを一つ一つコピーしていくアホ臭いことしないとならない しょうがないので俺はカラム列挙してコピーするメソッド自作したよ 俺ずっとADOのこと「アド」って読んでたんだけど・・・・ DataAdapterで更新っていうことにこだわってる理由がいまいちわからない。 どうして他の方法ではダメなのか、それを書かないとと思うのだが。 ExecuteNonQueryとか。 エスパーすると スキーマが度々変わってめんどい or カラム型チェックがなくなるのはヤダヤダ あたりじゃないか Visual Studio 2008 でSQL Server 2005 上のデータを表示・更新をするWindows Form アプリケーションを作ろうとしています。 下のようなSQLで取得できるデータが対象。 SELECT D.DataNo, D.Hizuke, D.CustomerID, C.CustomerName FROM TableData D JOIN Customer C on D.CustomerID=C.CustomerID 各カラムはフォーム上のTextboxに連結。 CustomerIDのTextboxを入力すると、CustomerNameのTextboxの表示が書き換えられる。 というのをやりたいんですが。 Windows Form アプリケーションのプロジェクトを新規作成。 データソースを新規作成。 使いそうなSQL Server上のテーブルを選んで追加。 データセットデザイナで、追加-TableAdapter。TableAdapter構成ウィザードを起動 ウィザードに従い、上のようなSQLを貼り付け、完了。 データセットデザイナ上にこんなのができた。 DataTable1 DataTable1TableAdapter Fill, GetData() Form1をデザイナで開き、DataTable1をドラッグ&ドロップ。 データが表示されるところまではできた。 あとどうしたらいいんですか。 TextBoxのチェンジイベント補足してSelectしろ >>372 回答者はお前だけじゃない。 答えられないからと”次”とかお前様主動でスレ進行させんな TextBoxのチェンジイベントでSelectが嫌なら、 Formオープン時にSelectして適当な変数に格納、TextBoxのチェンジイベントでその値を取得 って流れになると思う。 結局はTextBoxのチェンジイベントを使うんじゃないの? バインドしたらいいだけと言う対処方法を取る場合、 それの為だけに新しくテーブル作ったりするものなの? バインドの為にローカルでmdbファイル準備するとか。 Accessで言う連係だと思ってました。スマソ 非接続型になるから、メモリに読み込んでいて表示させても、 バインドしても処理内容は同じだったんだね。。。 俺が使ってみた感想としては、DataTableは配列の塊として使いやすいよね。 後は要らんって感じなんだがな。 DataSetの有効活用方法ってあるのだろうか?型指定されたDataSetを使わない 場合には必要あるのかな? >>381 複数のDataTableをぶち込んで受け渡し 非接続だからいちいちdtoクラスとか作らなくていい >>383 なるほど。サンクス。 リレーション情報の活用ってしてますか? 俺はプログラム上で実現してるから、リレーションの 設定やらって基本しない。 開発時にエラーが出たりするのが逆に面倒だったりする。 informixへの接続文字列わかる方いませんか? odbcを使わずに接続できるらしいんですが調べても全然分からないんです 385です情報ありがとうございます。 ●●.ConnectionString="Provider=Ifxoledbc;Data Source=データベース名@サーバー名;User ID=ユーザー名;Password=パスワード;" でしてみたのですがエラー0x80040E21が出たので解決策を模索中です。 なにか根本的に間違ってるかもしれないです… 検索エンジンGoogleで「インターネットテレビ 朝鮮総連 少頭劣一族 マイクロソフト社(又は経済産業省等気になる省やインターネットや原発、地震 波動砲)」を検索。 警察と自衛隊の武器は少頭劣一族が奪い、朝鮮に送ったらしい。知能障害以前の頭が悪い家族達。「工作員」の意味を知らない「工作員」家族。 すみません。質問いいですか? C#でデータベースをdataset(データグリッドビューにバインドして作りました)にして扱っているのですが 訳あって同じ構造の別名テーブルに差し替える必要がでました。 クエリビルダでテーブルを差し替えると列の並びが狂うのですが、なにがおかしいのでしょうか? また、列の並びをそのままに差し替えるいい方法はないでしょうか? よろしくお願いします。 すみません。急ぐもので。。C#スレに行かせて頂きます ★2ch勢いランキングサイトリスト★ ◎ +ニュース板 ・ 2NN ・ 2chTimes ◎ +ニュース板新着 ・ 2NN新着 ・ Headline BBY ・ unker Headline ◎ +ニュース板他 ・ Desktop2ch ・ 記者別一覧 ◎ 全板 ・ 全板縦断勢いランキング ・ スレッドランキング総合ランキング ・ ログ速 ◎ 全板実況込み ・ 2勢 ・ READ2CH ・ i-ikioi ※ 要サイト名検索 データベースデザイナ、便利だとの宣伝に釣られて使ってしまい、いま地獄を味わっている。 ado.netってc#と関係有りますか? c#習得出来たのでデータベースも勉強したいんですが、データベースってそれを使う目的が無いとプログラムも作れないし、どうやって勉強したらいいか迷っています。オススメの入門サイトなど有れば教えて下さい。 誰でも簡単にパソコン1台で稼げる方法など 参考までに、 ⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。 グーグル検索⇒『宮本のゴウリエセレレ』 IPPOSAG5MP ☆ 日本の、改憲をしましょう。現在、衆議員と参議院の両院で、 改憲議員が3分の2を超えております。『憲法改正国民投票法』、 でググってみてください。国会の発議はすでに可能です。 平和は勝ち取るものです。お願い致します。☆☆ AddWithValueによる型指定が出来ない クソ!と思ってたが、 cmd.Parameters.AddWithValue("@変数",値).SqlDbType = SqlDbType.VarChar みたいに簡単にできる事を知ったときはシビれた。 fillでdatasetにselectの結果が入ると思うんですが、そのテーブル名をsql側で指定することってできますか? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる