• 締切済み

Varcharサイズ変更後にエラー

こんにちは。宜しくお願いします。 かなり古いシステムでVB6で開発されているものがあるのですが、昨日、データーベース(SQLServer2005)のとあるテーブルの列のサイズをVarchar(1000)からVarchar(2000)へ変更しました。 すると、いままで問題なく稼動していたシステムにエラーが発生しまして、デバッグしてみると、SELECT文で取得した変更箇所の列の値が、NULLで戻ってきました。 NULL値の対策として、IsNull関数を使用して、NULL値の場合には、別の文字列に変換するようにしてあるのですが、IsNull関数ではNull=Falseを返します。 いろいろネットで文献を探しまして、Where句に指定している列名をSELECT句に含まないといけないという記述を発見しましたが、実行しても結果は変わりませんでした。 なにかSQLServer側で意識しなくてはいけない事があるのでしょうか。 当方、DBにはあまり詳しくないので、原因に心当たりのある方はご教授頂ければ幸いです。

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

奥が深いと思ったら、どこがおかしいのかは最終のアプリケーションの戻りだけを調べるのではなく、 いろいろな方法で問題がある個所を特定する必要がありますね。 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では正常ならば、プロバイダの問題という可能性もありますし、最終的にはテーブルを再作成(外部キーを保管して別のテーブルにデータを移すのは簡単にできます)すれば解決するかもしれません。

PonTaRo_M
質問者

補足

jamshid6さん、詳しいご回答ありがとうございます。 問題は解決しておりませんが、回避策はできました。 レコードセットをオープンしてそのレコードセットから直接、テキストボックスに値を代入していたのですが、レコードセットオープン直後に一旦、変数に格納し、その上でテキストボックスに代入するとエラーがなくなりました。 × テキストボックス1.text=rst!列名 ○ 変数1=rst!列名   テキストボックス1.text=変数1 これがどういうことかよくわかりませんが、すべての項目でなく、特定の列のみに発生するというのが解せません。 ちなみにエラーなる列は、varchar(2000)ですが、これより大きな別の列は問題なく稼動してます。 やはり原因とした、エラーとなる列のサイズを変更したことによることが起因のような気がします。 もしかすると、VB側の問題かもしれませんね。 一応、ご教授頂きました点は、試してみたいと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

IsNull関数というのはVB6のIsNull関数? それなら単純にその変換部分に何らかの問題があるんじゃないかと思いますが。 あと、NVarcharに変換したとか…(それでこういうエラーがでるとも思えませんが) ビュー経由でアクセスしているならそのビューを作りなおすとか。 あ。まさかMDBのリンクテーブル経由でDBアクセスしてるとかはないですよね? その場合、リンクテーブルは作り直しになりますが…。

PonTaRo_M
質問者

補足

khazad-leftyさん、ご回答ありがとうございます。 >>IsNull関数というのはVB6のIsNull関数? はいそうです。この関数をは他の列でも使用してますのでこの部分が問題の可能性は低いような気がします。 そもそもデバックで該当部分にブレークを張ってみてみると、DBから返却された列に、値が入っていたり、NULLになっていたりするんです。本来は値が入っている項目になります。 なにかプログラムのバグという雰囲気ではないのです。 MDBは使用してません。SQLServerにODBC(DAO)で接続しています。 確かにビューを呼び出してるので、ビューを作り直してみましたし、ビューを経由しないで直接テーブルを参照しても改善されませんでした。 なんとなく、SQLServer側の特にカーソル関係の問題ではないかと思いますけど、正直わかりません。 ネットでも同様の現象の事例が見つからず、解決の糸口すらない状態です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Pro*CでVARCHAR2項目の検索

    こんにちは。たぶんとても基礎的なことと思うのですが。。。 Pro*CでSELECTするとき、WHERE句の中でVARCHAR2項目を条件に入れています。 が、どうも検索がうまくできなくて質問しました。 ホスト変数の定義…  char VVV[5]; 検索するところ… select xxx into :yyy from ZZZ where ZZZ.varchar2no4BYTE = :VVV ; のような感じです。ZZZ.varchar2no4BYTEの型はVARCHAR2(4)です。 で、ZZZ.varchar2no4BYTE が"1234"と"12"の2つのレコードを 登録しておいて、VVVに"1234"を入れると、ちゃんと検索できました。 んが、VVVに"12"を入れても検索されません。 そんなのあり?と VVVに"12 "を入れてもだめ、 VVVをVARCHAR構造体?にして、"12"で長さ2にしてもだめ、 だけどZZZ.varchar2no4BYTEがCHAR(4)だと"12"でOK、 なんなんだとPro*Cのマニュアル見てもNUMBER型の検索例ばかり、 というところで力尽きました。 (あー、CHAR_MAP=STRING って関係あるですかね) 動的SQLにすればよいのかもしれませんが、事情で使えないのです。 それ以前にホスト変数の理解が間違っているのではないかと思い、 お聞きするしだいです。

  • selectで特定の列をwhereで指定するとエラーになる

    今MYSQLのselect文でエラーが出ていて、where でgroupを指定するとエラーが出ます。どこかの書き方が間違っているようなのですが、正しい書式を教えていただけないでしょうか? 色々と実験してみて同じ書き方でほかの列を検索したときは検索が出来ることがわかったので、どこを直していいのかわからない状態です。 環境はWinXP Home SP2 MySQL 5.0.27-community-nt です。 操作しているテーブルは以下の通りで、IDやscodeを検索しようとすると正常に表示されます。 CREATE TABLE `product` ( `ID` int(11) default NULL, `id_seq` int(11) default NULL, `scode` varchar(50) default NULL, `rec_ctl` varchar(10) default NULL, `dir` varchar(100) default NULL, `image` varchar(100) default NULL, `image_s` varchar(100) default NULL, `brand` varchar(100) default NULL, `goods` varchar(100) default NULL, `group` varchar(50) default NULL ); 実行したSQL文と結果です。 mysql> select * from product where group = 'a'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'group = 'a'' at line 1 IDなどであれば検索が出来ます。 mysql> select * from product where id = 'a'; Empty set (0.00 sec) それではよろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 列の桁数変更の方法 (oracle 8i)

    oracle 8.1.7 を使用 下表の列2を下記のように変更したいのですが 方法(SQLplusにて)が分かりません、 ご教示くださいますようよろしくお願いいたします (変更前)列2:T_MIX_PTN VARCHAR2(1) NOT NULL (変更後)列2:T_MIX_PTN VARCHAR2(3) NOT NULL 表 :T_MIX ---------------------------------------- 列1:T_MIX_CD VARCHAR2(4) NOT NULL 列2:T_MIX_PTN VARCHAR2(1) NOT NULL 列3:T_MIX_CNT NUMBER(1,0) NOT NULL 列4:T_MIX_GCD1 VARCHAR2(6) NOT NULL 列5:T_MIX_GRATE1 NUMBER(4,1) NOT NULL 列6:T_MIX_GCD2 VARCHAR2(6) NOT NULL 列7:T_MIX_GRATE2 NUMBER(4,1) NOT NULL

  • 【SQLServer】IS NULLのパフォーマンス

    お世話になっております。SQLSERVER初心者です。 NULLを含む列COL1を検索条件に入れる場合、 パフォーマンスの観点から WHERE COL1 IS NULL とするのではなく WHERE ISNULL(COL1,'') = '' とするよう有識者から言われました。 そこで質問なのですが、 (1)IS NULL は基本的に上記のように変換したほうが早くなるのですか? (2)COL1にもしインデックスが設定されていたとしても、上記の場合だとどちらも効かないですよね? 詳しい方おしえてください。 よろしくおねがいします。

  • 変数の取り扱いについて

    はじめまして。思いっきりSQLSERVERは初心者なんですが宜しくお願いします。 現在SQLSERVER2005です。 ややこしくなるので要点だけ以下まとめています。 変数を利用してレコードを抽出する時なんですが… ALTER PROCEDURE Test @Rank INT BEGIN DECLARE @SELECT AS VARCHAR(100) DECLARE @WHERE AS VARCHAR(100) DECLARE @SQL AS VARCHAR(200) SET @SELECT = 'SELECT * FROM tblA ' SET @WHERE = 'WHERE Rank > ' + @Rank SET @SQL = @SELECT + @WHERE EXEC(@SQL) END 実行すると varchar の値 'WHERE Rank > 'をデータ型 int に変換できませんでした。 となります。 Rank部分が数値なんですが、どのように取扱いすべきなんでしょうか。

  • エラー「無効な識別子です」

    ORA-00904: "EMPNO": 無効な識別子です と表示されます。 解決方法知っている方、教えていただければ幸いです。 SELECT EMPNO, ENAME, D.DEPTNO, DNAME FROM DEPT D WHERE EMPNO = (SELECT EMPNO FROM EMP WHERE MGR IS NULL) SQL> DESCRIBE EMP; 名前 NULL? 型 ----------------------------------------- -------- ---------------------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NOT NULL NUMBER(2)

  • [ASP+SQLserver]空白フィールドのWHEREは?

    こんにちわ。 ASPとSQLサーバで簡単なWebを作っています。 まず、以下のようなデータがあるとします。 (列名) 列A,列B,列C (データ)aaaa,NULL,NULL      bbbb,1111,NULL ※NULLは文字列ではなくNULLです。 そこでNULLであるレコードを取得したいので次のようなクエリで実行してみました。 SELECT * FROM sample WHERE(列B='') ORDER BY 列A しかし、あえなく敗北・・・。 また、NULLでないレコードを取得するために、 SELECT * FROM sample WHERE(列B<>'') AND(列C<>'') ORDER BY 列A しかし、こちらもあえなく敗北・・・。 こういうケースはどのようなクエリでやればいいのでしょうか? お手数をお掛けいたしますが宜しくお願いいたします。

  • SQLServerでのSELECT文をORACLE9iで使用したいのですが・・・

    SQLServer2000で使用していたSELECT文をORACLE仕様にする場合どのように修正すればよいですか? 試行錯誤やっているのですが、思うようにできません。 関数a(関数b())といった作法は無理なのでしょうか? ※関数a(関数b())のような構成だと [ORA-00938: 関数の引数が不足しています] 等が発生する (SQLServerでのSELECT文) SELECT F列A + SPACE(11-LEN(F列A)) + ISNULL(F列B,SPACE(0)) AS F列C, F列A ,F列B FROM T表 どなたかご教授おねがいします

  • 列名の変更 (Oracle 8.1.7)

    表:TB_TEST 列:TB_TEST_MODE VARCHAR2(1) があります。列:TB_TEST_MODE VARCHAR2(1)を下記に変更するには SQLplusでどのようにすれば良いのでしょうか? (1)列名の変更:TB_TEST_TESTMODE VARCHAR2(1) (2)型式の変更:TB_TEST_MODE NUMBER(1) (3)サイズの変更:TB_TEST_MODE VARCHAR2(5) (4)サイズの変更:TB_TEST_MODE NUMBER(5) 以上、ご存知の方ご教示宜しくお願いいたします

  • SQLServer7.0で、SELECT文で列を抽出する ※Nullと0の条件について

    SQLServer7.0で、SELECT文で列を抽出する際なんですが、 列A 列B --------- 1  Null 2  Null 3  1 ↑のテーブルから、列Aの1、2だけを抽出するSELECT文を SELECT * FROM XXX WHERE 列B <> 1 と作成したのですが、うまく動作しません(汗) データが一件も取れないのです。(列B:tinyint型、Null許容) テーブル内のデータをNull→0にして、同SELECT文で抽出すればうまくいったのですが。。 Nullデータを、<>XX という条件で取得することはできないんですかねえ・・・。 それとも、テーブルの設定か、条件の記述方法がまずいんでしょうか。 どなたか、ご存知あればアドバイスをお願いします。

このQ&Aのポイント
  • 蚊に刺された跡の色素沈着に、ヤケド治療用の軟膏をつけたら治るでしょうか?市販のアットノンのような使用方法で、以前クリニックで処方されたヤケド治療用の軟膏を塗ったら、なにか効果はあるでしょうか?
  • 蚊に刺された跡の皮膚が黒くなり、1年以上も残っています。日本の蚊に刺された跡だと、たいてい冬になる頃には自然に元の肌色に戻るのですが、今住んでいる国の蚊は、肌をかかないようにしても、痒くなるだけでなく腫れて必ず痛みを伴います。それが治ると黒く色素沈着する流れです。それで足じゅう、特に足首にあちこち黒い色素沈着が起こり1年経っても治る気配がなく、明らかに日本の蚊との違いがみられます。
  • 軟膏薬の詳細を記します。商品名:Silvin cream - burns and sores製造元:ICM pharma pte ltd.有効成分:Silver Sulfadiazine USP 1%, Chlorhexidine Digluconate 0.2%詳細には、「スルファジアジン銀とクロルヘキシジンを配合した抗菌クリームで、火傷、下腿潰瘍、褥瘡に伴う皮膚感染の予防と治療を目的としています。」とあります。
回答を見る