- 締切済み
Varcharサイズ変更後にエラー
こんにちは。宜しくお願いします。 かなり古いシステムでVB6で開発されているものがあるのですが、昨日、データーベース(SQLServer2005)のとあるテーブルの列のサイズをVarchar(1000)からVarchar(2000)へ変更しました。 すると、いままで問題なく稼動していたシステムにエラーが発生しまして、デバッグしてみると、SELECT文で取得した変更箇所の列の値が、NULLで戻ってきました。 NULL値の対策として、IsNull関数を使用して、NULL値の場合には、別の文字列に変換するようにしてあるのですが、IsNull関数ではNull=Falseを返します。 いろいろネットで文献を探しまして、Where句に指定している列名をSELECT句に含まないといけないという記述を発見しましたが、実行しても結果は変わりませんでした。 なにかSQLServer側で意識しなくてはいけない事があるのでしょうか。 当方、DBにはあまり詳しくないので、原因に心当たりのある方はご教授頂ければ幸いです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jamshid6
- ベストアンサー率88% (591/669)
奥が深いと思ったら、どこがおかしいのかは最終のアプリケーションの戻りだけを調べるのではなく、 いろいろな方法で問題がある個所を特定する必要がありますね。 1)SQL Server Management StudioでSQL Serverに直接接続する ・古いアプリケーションと書いてあったので、もともとSQL Server 2005ではなかったのであれば、 データベースのプロパティで互換性レベルが90になっているかどうか確認する ・クエリ画面でテーブルを直接SELECTし、確かに値が入っていることを確認する ・対象のクエリを投げてみて、確かに値が入っていることを確認する 2)MSDASQL以外の違うプロバイダを使って接続してみる ・ADOで接続してみる(ゴミプログラムを書いて確認) Dim cn As Object Dim rs As Object Set cn = CreateObject("ADODB.Connection") Set rs = CreateObject("ADODB.Recordset") cn.Open "Provider=SQLOLEDB;Data Source=インスタンス名;User ID=ユーザ名;Password=パスワード;Initial Catalog=データベース名" rs.Open "クエリ",cn Do Until rs.EOF ' Msgbox や Debug.Printで中身を確認 rs.MoveNext Loop rs.Close cn.Close Set rs = Nothing Set cn = Nothing ・上記のProviderを"SQLNCLI"に変更して確認してみる 今の段階ではなんとも言えないですが、MSDASQLではエラーでSQLOLEDBでは正常ならば、プロバイダの問題という可能性もありますし、最終的にはテーブルを再作成(外部キーを保管して別のテーブルにデータを移すのは簡単にできます)すれば解決するかもしれません。
- khazad-lefty
- ベストアンサー率44% (296/668)
IsNull関数というのはVB6のIsNull関数? それなら単純にその変換部分に何らかの問題があるんじゃないかと思いますが。 あと、NVarcharに変換したとか…(それでこういうエラーがでるとも思えませんが) ビュー経由でアクセスしているならそのビューを作りなおすとか。 あ。まさかMDBのリンクテーブル経由でDBアクセスしてるとかはないですよね? その場合、リンクテーブルは作り直しになりますが…。
補足
khazad-leftyさん、ご回答ありがとうございます。 >>IsNull関数というのはVB6のIsNull関数? はいそうです。この関数をは他の列でも使用してますのでこの部分が問題の可能性は低いような気がします。 そもそもデバックで該当部分にブレークを張ってみてみると、DBから返却された列に、値が入っていたり、NULLになっていたりするんです。本来は値が入っている項目になります。 なにかプログラムのバグという雰囲気ではないのです。 MDBは使用してません。SQLServerにODBC(DAO)で接続しています。 確かにビューを呼び出してるので、ビューを作り直してみましたし、ビューを経由しないで直接テーブルを参照しても改善されませんでした。 なんとなく、SQLServer側の特にカーソル関係の問題ではないかと思いますけど、正直わかりません。 ネットでも同様の現象の事例が見つからず、解決の糸口すらない状態です。
補足
jamshid6さん、詳しいご回答ありがとうございます。 問題は解決しておりませんが、回避策はできました。 レコードセットをオープンしてそのレコードセットから直接、テキストボックスに値を代入していたのですが、レコードセットオープン直後に一旦、変数に格納し、その上でテキストボックスに代入するとエラーがなくなりました。 × テキストボックス1.text=rst!列名 ○ 変数1=rst!列名 テキストボックス1.text=変数1 これがどういうことかよくわかりませんが、すべての項目でなく、特定の列のみに発生するというのが解せません。 ちなみにエラーなる列は、varchar(2000)ですが、これより大きな別の列は問題なく稼動してます。 やはり原因とした、エラーとなる列のサイズを変更したことによることが起因のような気がします。 もしかすると、VB側の問題かもしれませんね。 一応、ご教授頂きました点は、試してみたいと思います。 ありがとうございました。