• 締切済み

Win32::ODBC。後ろスペースを切らずにデータを読み込みたい

ActivePerlからODBC経由でACCESSデータを取得するプログラムを作成しています。 作成中の下記プログラムですと、TABLE_AのKOUMOKU_A が  ' '(半角スペース)がの場合     → ''(スペースなし)  'BBB '(後ろスペースあり)の場合 → 'BBB'(後ろスペースなし) で返ってきます。 登録されているすべての文字列を読み込みたいのですが、 何が原因で後ろスペースが切られるのかがわかりません。 ご存じのかた、ご教授願いますm(__)m 例) ============================================ use Win32::ODBC; $sql = "select KOUMOKU_A from TABLE_A;"; while ( $db->FetchRow() ){ undef %FIELDS; # データをハッシュに格納 %FIELDS=$db->DataHash(); print "'".$FIELDS{KOUMOKU_A}."'\n"; } ============================================

  • Perl
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

Access では、末尾の半角スペースは保存時に削除されるというのが仕様です。 解決法としては、定型入力 プロパティを & と設定することで、 半角スペースも保存することができます。 アクセスファイルには半角スペースが保存されていますか? 安全に対処するのであれば保存時に半角スペースは別文字に変えておくのがいいと思います。 本質的な解決策ではないですが・・・・ 参考になりましたら。

kumabon
質問者

補足

ご回答ありがとうございます。 ACCESSは勉強中なので、参考になります。 ただ今回は業者が作ったDBで、下記のcreate文で テーブルを作成すると、同じテキスト型でも差があるようです。 create table ( AA char(5),  ←空白埋めあり BB text(5)   ←空白埋めなし ) char型で作成されたフィールドのデータで、 後ろについている空白の読込みができなくて困っています。

関連するQ&A

  • PerlとWin32::ODBCを使ってDBにアクセスするときに出るエラー

    こんばんわ。最近、Perlを使い始めたばかりの初心者です。解決方法がわからないので、教えて下さい。 PerlとWin32::ODBCを使ってDBにアクセスするプログラムを組んでいるます。DB接続まではうまくいくのですが、それ以降に以下のようなエラーがでます。モジュールが足りないようなのですが、どのようにして解決すればよいかわかりません。以下にエラーとコードを記入します。 コード: #!/usr/local/bin/perl $DSN = "DSN=DB1;UID=kaki388"; use Win32::ODBC; if (!($0 = new Win32::ODBC($DSN))){ print Win32::ODBC::Error(); print "失敗"; exit(); } print "成功"; $sql = "SELECT * FROM tbl1"; $0->run("$sql"); $0->sql("$sql"); @fn = $0->FieldNames(); while($0->FetchRow()){ undef %Data; %Data = $0->DataHash(); print "$Data{$fn[$i]}<BR>\n"; } $0->Close; エラーコード: 2004/08/26(11:49:14) W-SV 127.0.0.1 [80] E200042 "Can't locate object method "run" via package "Win32::ODBC=HASH(0x275020)" (perhaps you forgot to load "Win32::ODBC=HASH(0x275020)"?) at odbc.cgi line 11. " よろしくお願い致します。

    • ベストアンサー
    • Perl
  • FetchRow()によるデータの取得

    どなた様か、お知恵をください。 Win32 ODBCでデータベースのデータを取得するコードを書いております FetchRow()メソッドについて、マニュアルを読みますとFetchRow([ROW])の ROWを指定することにより、キーセットを相対的にROW番目の行に移動できると記述されておりました。 これを利用してROW番目の行からのデータを得ようと考えたのですが、下記のコードでは先頭からのデータを読んでしまうようです。 どのようにしたら指定の行からのデータを読めるのでしょうか。 use Win32::ODBC; my $dbs = new Win32::ODBC("DSN=seminar"); $dbs->Sql("SELECT dataid, event_name FROM T001"); for($i=0; $i < 15; ++$i){ $dbs->FetchRow(10); undef %FIELDS; %FIELDS = $dbs->DataHash(); } $dbs->Close();

    • ベストアンサー
    • Perl
  • odbc接続処理が遅い

    vb.netにてプログラムを作成して使用しており、DBはpostgresqlをodbc接続にて使用しております。 ある端末で処理が極端に遅く、デバッグにて検証したところ、DB処理で時間がかかっていることがわかりました。 それに伴い同端末で別システムのoracleへのodbc接続も同じ現象となっている状況です。 この端末ではpostgresqlのodbcドライバの入れ替えを行ったことがあり、その頃から遅くなったようです。 また、別の全く同じ環境の端末では特に問題ない処理速度で稼働しております。 odbcドライバの入れ替えは何度か行っておりますが改善されません。 改善方法をご存じの方はおられますでしょうか?

  • ODBCでデータ抽出エラー

    下記プログラムを実行すると、データ抽出エラーとなってしまいます。 <?php $dsn = "database_4"; $user = ""; $pass = ""; $enc_disp = "EUC-JP"; $enc_db = "SJIS"; function cnv_enc($string, $to, $from) { $det_enc = mb_detect_encoding($string, $from . ", " . $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } $conn = odbc_connect($dsn, $user, $pass) or die("接続エラー"); $sql = "SELECT music_0_ID,大分類,日本語作曲家名,日本語曲名 FROM music ORDER BY music_0_ID"; $res = odbc_exec($conn, $sql) or die("データ抽出エラー"); echo "<table border=\"1\">"; echo "<tr>"; echo "<td>ID</td>"; echo "<td>大分類</td>"; echo "<td>日本語作曲家名</td>"; echo "<td>日本語曲名</td>"; echo "</tr>"; while ($row = odbc_fetch_row($res)) { echo "<tr>"; echo "<td>".odbc_result($res, "music_0_ID")."</td>"; echo "<td>".cnv_enc(odbc_result($res, "大分類"), $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc(odbc_result($res, "日本語作曲家名"), $enc_disp, $enc_db)."</td>"; echo "<td>".odbc_result($res, "日本語曲名")."</td>"; echo "</tr>"; } echo "</table>"; odbc_close($conn); ?> デバッグすると、解決できるでしょうか?PHP5.3.6.0を使用しているため、Zend Debuggerをインストールすべきか迷っています。また、Apacheでなく、IIS7.0を使用しています。アンインストールして、XAMPPを使用すべきでしょうか?また、リモートデバッグをする場合、PCが2台(サーバとクライアント)必要になるのでしょうか?

    • ベストアンサー
    • PHP
  • PerlCGIでクエリの検索結果が途中で途切れる。

    PerlCGIでクエリの検索結果が途中で途切れる。 環境: Windows 7 Home Premium 32bit Mem: 3.24GB Apache for win 2.2 Perl: v5.10.1 built for MSWin32-x86-multi-thread access の mdb を ODBC 接続し perl cgi をフロントエンドとして クエリを表示させようとしています。 クエリの表示自体はエラーなくできましたが、検索結果が全て表示されません。 # 本来は 200件以上あるはずなのに、半分以下しか表示されない。 感触として、バッファかなにかのバイト制限のような気もするのですが、 全ての検索結果を表示するためにはどうすればよいのかご教示いただけないでしょうか? コードは以下のとおりです。 -------------------------------------------------------- #!c:/perl/bin/perl.exe use Win32::ODBC; print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\n"; $db= new Win32::ODBC("DSN=kaigai"); $str_sql = "SELECT q_prestounyu.hiduke, q_factory_master.koujyoryakumei, q_prestounyu.keiyaku, " ; $str_sql .= "q_prestounyu.hinban, q_pres_master.ryakumei, q_prestounyu.nyukousu "; $str_sql .= "FROM (q_prestounyu INNER JOIN q_pres_master ON q_prestounyu.presno = q_pres_master.presno) "; $str_sql .= "INNER JOIN q_factory_master ON q_prestounyu.koujyo = q_factory_master.koujyono "; $str_sql .= "WHERE (((q_prestounyu.hiduke)>=#2010/1/10# And (q_prestounyu.hiduke)<=#2010/1/31#)) "; $str_sql .= "ORDER BY q_prestounyu.hiduke;"; print "$str_sql<BR>\n"; $i=0; $db->Sql($str_sql); # 取得したレコードセットの数だけループして表示 while ( $db->FetchRow() ){ $i ++; undef %FIELDS; # 各フィールドのデータをハッシュに格納 %FIELDS= $db->DataHash(); print "$i "; print "$FIELDS{'hiduke'} $FIELDS{'koujyoryakumei'}\n"; print "$FIELDS{'keiyaku'} $FIELDS{'hinban'}\n"; print "$FIELDS{'ryakumei'} $FIELDS{'nyukousu'}<BR>"; } # データベースを閉じる $db->Close( ); print "</body></html>"; exit;

  • SQLServer2005ExpressでのODBC

    お世話になります。WorkGroup構成のWindows2003ServerにSQLServerExpressをインストールしました(混合認証モード)。その後ネットワークの構成でTCP/IPを有効化し、新しいDatabaseを作成。ユーザーも作成しました。 サーバ名:ABC /インスタンス名:DB01 WindowsXP SP2のクライアントからODBCデータソースを作成しようとするのですが「接続出来ませんでした:Serverが存在しないか、アクセスが拒否されました」というエラーがでて作成出来ません。 サーバー名の欄には、ABC DB01両方確かめました(なぜか一覧表示には出てこない) これだけでは分からないと思います。どこから調べていけばいいのでしょうか?

  • odbcドライバのバージョンについて

    教えてください。 mdbを利用したactive sever pagesを作成しているのですが、ODBCのバージョンによってうまくいったり、いかなったりしてるような気がします。 A:Ver3.51 B:Ver4.00の場合 Bのときは、問題なく動作するのですが、Aのときは全くレスポンスがなくなります。また、その後、ODBCに設定されているフォルダを削除しようとしても、使用中のため削除できないというメッセージが出ます。 上記の様にODBCドライバのバージョンによって正常に動かなくなることはあるのでしょうか? また、バージョンアップの方法を教えてください。

  • 全角文字が???になる

    コマンドプロンプトからクエリを発行したときは問題なく表示されるんですが、ASPからだと全角文字が???になってしまいます。 また、NULL項目を除外したいので Where DeleteFlg is Null という条件を付加したんですが、 今度は何も表示されなくなります。 原因等、わかるかたがいましたら、お力をお貸しください。 Set db=Server.CreateObject("ADODB.Connection") db.Open "dsn=AIU;Server=172.17.0.110; Database=db1; UID=root; PWD=admin;" db.CursorLocation = 3 Set rs = db.Execute("Select * From table1") Do While Not(rs.EOF) Response.Write rs.Fields.Item("koumoku1") & vbNewLine Loop 環境 Windows2003Serverエンタープライズ MySQL5.0 MySQL ODBC 3.51 Driver IE6.0

    • ベストアンサー
    • MySQL
  • スペース文字を、DBサーバーの文字タイプに変換する方法を教えて下さい

    本番の動作環-------------------------------------------- webサーバー : Apache 2.0.58 (winXP sp2) dbサーバー1 : DB2 UDB・・・ODBC接続 dbサーバー2 : MySQL・・・[MySQL][ODBC 3.51 Driver]          [mysqld-5.0.22-community-nt] PHP : PHP Version 5.1.4 ------------------------------------------------------- 異なるdbサーバーのTABLE(TB1)とTABLE(tb2)を結合するPHPなのですが、結合キー(2桁)に、フル桁入っている時はOKなのですが、実行結果の最終行のところみたいに、”S ”・・・スペースがある場合は、結合出来ないで泣き別れになってしまいます。 たぶん、dbサーバーが異なるのでスペースの内部文字コードが違うのかな?と思うのですが、良きアドバイスをお願いいたします。 実行結果------------------------------------------------ key ODBC1(TB1)    | ODBC2(tb2) CD 国 名 ローマ字1 | 首 都 ローマ字2 ---------------------|-------------------------------- AA 日本  NIPPON   | 東京  Tokyo BB 中国  CHAINA   | 北京  Pekin DD 米国  U.S.A    | ワシントン Washington S S国  S-KUNI    |             <==泣き別れ S              | S首都  S-SYUTO <==泣き別れ S S国  S-KUNI    | S首都  S-SYUTO  <==good!(正解) ========================================================= dbサーバーをMysqlの1つだけにしたPHPの場合はgood!(正解)できます。 こんな質問で理解してもらえますか?

    • ベストアンサー
    • PHP
  • SQLServerにodbcで接続

    こんにちは。 WindowsServer2003でIIS・SQLServer・ASP(VBScript)を使って簡単なデータベースを作りたいのですが、いきないつまずいています。 testデータベースをSQLServerで作り、ODBCに【odbcsqlsv】と登録しました。 ASPスクリプトを <%@ Language=VBScript %> <html> <head> <title>動作テストHTML</title> </head> <body> <% Response.Write "テストーASP" Set cn = server.CreateObject("ADODB.Connection") StrCn ="odbcsqlsv" cn.Open StrCn strSQL = "SELECT * FROM table2" Set RS = cn.Execute(strSQL) Do While Not RS.EOF Response.Write RS.fields("name") RS.movenext Loop cn.close set cn = nothing %> </body> </html> を書き実行すると Microsoft OLE DB Provider for ODBC Drivers エラー '80040e4d' [Microsoft][ODBC SQL Server Driver][SQL Server]ユーザー '(null)' のログインに失敗しました。理由 : SQL Server の信頼関係接続に関連付けられていません。 とエラーが出ます。 SQL Serverの信頼関係接続とは何でしょうか? また関連付けはどのようにして行ったらよいのでしょうか? すみませんが、ご教授のほどをよろしくお願いします。