C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: C#でPostgreSQLに接続


(過去ログ 40 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■20925 / inTopicNo.1)  C#でPostgreSQLに接続
  
□投稿者/ alice (1回)-(2008/06/19(Thu) 23:16:33)

分類:[C#] 

C#でテキストファイルからSQLを読み込み、SQLを実行するツールを作成しています。

postgreSQLへ接続は出来ているのですが、
実際にinsertするすると、
 ERROR [HY000] Error while executing the query;
 ERROR: invalid byte sequence for encoding "UTF8": 0xa4
とエラーが出てしまい、進めない状態です。

postgreSQLへのinsert方法がわかる方はいないでしょうか?
postgreSQLはUTF-8でデータベースを作成しています。

// 以下insert部分のソースです。
// ここに張り付ける際に、いらない処理を省いています。
string myConnection = string.Empty;
myConnection += "DRIVER=PostgreSQL;"; // PostgreSQL を指定
myConnection += "SERVER=localhost;"; // 接続先
myConnection += "DATABASE=testdb;"; // データベース名
myConnection += "USERNAME=postgres;"; // 接続ユーザ名
myConnection += "PASSWORD=password;"; // パスワード

// SQL読み込み(insert into test(name) values('あああ')を読み込む)
// ファイルはUTF-8 + LF
String sql;
StreamReader readtext = new StreamReader(fullPath);
sql = readtext.ReadLine();

// 接続を開く
OdbcConnection myConn = new OdbcConnection(myConnection);
myConn.Open();

// コマンドの作成
OdbcCommand myOdbcCommand = new OdbcCommand();
myOdbcCommand.Connection = myConn;

// insertを実行(半角英数だとinsertできます。)
myOdbcCommand.CommandText = sql;
myOdbcCommand.ExecuteNonQuery();// <--ここでエラーが表示されます。
引用返信 編集キー/
■20927 / inTopicNo.2)  Re[1]: C#でPostgreSQLに接続
□投稿者/ ま (57回)-(2008/06/20(Fri) 00:06:29)
No20925 (alice さん) に返信
>  ERROR [HY000] Error while executing the query;
>  ERROR: invalid byte sequence for encoding "UTF8": 0xa4

http://www2.atpages.jp/mirror/2ch/perl/prog/read.php/1157874614/

Perlスレだけど。

BOM無し「あああああ」
0 : E3 81 82 E3 81 82 E3 81 82 E3 81 82 E3 81 82 ・・・・・・・・・・・・・・・

BOM有り「あああああ」
0 : EF BB BF E3 81 82 E3 81 82 E3 81 82 E3 81 82 E3 ・サ ソ ・・・・・・・・・・・・・
1 : 81 82 ・・

a4 って何でしょうね。
SJISにでも解釈されているのではないでしょうか?

StreamReaderにエンコーディング指定したらどーです?



引用返信 編集キー/
■20931 / inTopicNo.3)  Re[2]: C#でPostgreSQLに接続
□投稿者/ alice (3回)-(2008/06/20(Fri) 09:11:57)
ま さん、返信ありがとうございます。

>SJISにでも解釈されているのではないでしょうか?
>StreamReaderにエンコーディング指定したらどーです?

// SQL読み込み(insert into test(name) values('あああ')を読み込む)
// ファイルはUTF-8 + LF
String sql;
StreamReader readtext = new StreamReader(fullPath,Encoding.UTF8); <--UTF-8を指定しました。
sql = readtext.ReadLine();

エンコーディングを指定したのですが、
何も変わらず、
 ERROR [HY000] Error while executing the query;
 ERROR: invalid byte sequence for encoding "UTF8": 0xa4
のエラーが出てしまいます。

何かわかる方いないでしょうか?
引用返信 編集キー/
■20932 / inTopicNo.4)  Re[3]: C#でPostgreSQLに接続
□投稿者/ ネタ好き (469回)-(2008/06/20(Fri) 09:24:09)
No20931 (alice さん) に返信
まずはポスグレの文字コードの設定を調べましょう。
引用返信 編集キー/
■20933 / inTopicNo.5)  Re[4]: C#でPostgreSQLに接続
□投稿者/ みきぬ (1回)-(2008/06/20(Fri) 09:36:04)
[壁]・ω・) EUCだと「あ」は0xA4A2ですね。
引用返信 編集キー/
■20934 / inTopicNo.6)  Re[1]: C#でPostgreSQLに接続
□投稿者/ Mr.T (262回)-(2008/06/20(Fri) 09:54:02)
Mr.Tです、こんにちは

該当エラーメッセージを単純にぐぐってみたものですが、こんなことに該当しますか?

http://www.deftrash.com/blog/archives/2007/09/invalid_byte_sequence_for_enco.html

ここのリンク先
http://opentechpress.jp/security/article.pl?sid=06/05/31/0737235
なんかは参考になりますか?

#Insertoの直接発行ではなく、sqlCommand.Parameter.addを使って
#パラメータ追加してね、ということか?


引用返信 編集キー/
■20935 / inTopicNo.7)  Re[5]: C#でPostgreSQLに接続
□投稿者/ alice (4回)-(2008/06/20(Fri) 10:12:33)
ネタ好き さん、みきぬ さん 返信ありがとうございます。

>まずはポスグレの文字コードの設定を調べましょう。
「psql -l」で文字コードを再度調べてみたのですが、UTF8になっています。

>EUCだと「あ」は0xA4A2ですね。
たしかにEUCだと、「0xA4A2」になってます。
EUCは、まったく使ってないつもりなんですけどね。
postgreSQL設定等があるのでしょうか?
引用返信 編集キー/
■20936 / inTopicNo.8)  Re[2]: C#でPostgreSQLに接続
□投稿者/ alice (5回)-(2008/06/20(Fri) 10:41:55)
Mr.T さん 返信ありがとうございます。

> 該当エラーメッセージを単純にぐぐってみたものですが、こんなことに該当しますか?
>http://www.deftrash.com/blog/archives/2007/09/invalid_byte_sequence_for_enco.html
>http://opentechpress.jp/security/article.pl?sid=06/05/31/0737235

PGCLIENTENCODING=SQL_ASCII
は、試してみたのですが設定前後でエラーメッセージの変化はありませんでした。


> #Insertoの直接発行ではなく、sqlCommand.Parameter.addを使って
> #パラメータ追加してね、ということか?
Parameter.addは試してなかったので、試してみたのですが、
結果同じエラーが出力されました。

引用返信 編集キー/
■20937 / inTopicNo.9)  Re[2]: C#でPostgreSQLに接続
□投稿者/ ネタ好き (470回)-(2008/06/20(Fri) 10:42:25)
ポスグレは出力は文字コードが違うよ。
ポスグレはクライアントサーバー型だから、クライアントに送るメッセージの文字コードを変更できます。それにより幾つか文字コードの設定があると思います。マニュアルを熟読すれば書いてありますので一度設定関係を読んでみて下さい。
引用返信 編集キー/
■20938 / inTopicNo.10)  Re[3]: C#でPostgreSQLに接続
□投稿者/ alice (6回)-(2008/06/20(Fri) 10:53:26)
ネタ好き さん、返信ありがとうございます。

>ポスグレは出力は文字コードが違うよ。
>ポスグレはクライアントサーバー型だから、クライアントに送るメッセージの文字コードを変更できます。
>それにより幾つか文字コードの設定があると思います。マニュアルを熟読すれば書いてありますので一度設定関係を読んでみて下さい。
たぶんその設定が、Mr.Tさんが教えてくれた
 PGCLIENTENCODING
の設定になると思うのですが、
このあたりを調べてみます。
引用返信 編集キー/
■20958 / inTopicNo.11)  Re[4]: C#でPostgreSQLに接続
□投稿者/ 倉田 有大 (273回)-(2008/06/20(Fri) 23:12:47)
No20938 (alice さん) に返信
> ネタ好き さん、返信ありがとうございます。
>
> >ポスグレは出力は文字コードが違うよ。
> >ポスグレはクライアントサーバー型だから、クライアントに送るメッセージの文字コードを変更できます。
> >それにより幾つか文字コードの設定があると思います。マニュアルを熟読すれば書いてありますので一度設定関係を読んでみて下さい。
> たぶんその設定が、Mr.Tさんが教えてくれた
>  PGCLIENTENCODING
> の設定になると思うのですが、
> このあたりを調べてみます。

SQLを読み込むのではなくて直接ソースに書くと大丈夫なんでしょうか?
引用返信 編集キー/
■20992 / inTopicNo.12)  Re[5]: C#でPostgreSQLに接続
□投稿者/ alice (7回)-(2008/06/23(Mon) 10:15:08)
倉田 有大 さん、返信ありがとうございます。
返信が遅くなり、すいませんでした。

> SQLを読み込むのではなくて直接ソースに書くと大丈夫なんでしょうか?
直接SQLを書いた場合でも、同じエラーが表示されます。

後、少し進展がありました。
postgresql.confのclient_encodingを、EUC_JPに設定すると
とりあえずは、なぜか日本語をinsertできるようになりました。

しかし、外字をしようすると、エラーが表示されます。


引用返信 編集キー/
■20995 / inTopicNo.13)  Re[6]: C#でPostgreSQLに接続
□投稿者/ ネタ好き (480回)-(2008/06/23(Mon) 11:44:48)
No20992 (alice さん) に返信
> しかし、外字をしようすると、エラーが表示されます。

外字はまずいです。
なぜならば、クライアント側の外字設定がサーバ側と同じとは限らないからです。
なるべく外字は避けるべきだと思います。
引用返信 編集キー/
■21044 / inTopicNo.14)  Re[7]: C#でPostgreSQLに接続
□投稿者/ alice (8回)-(2008/06/23(Mon) 21:43:05)
ネタ好き さん、返信ありがとうございます。

> 外字はまずいです。
> なぜならば、クライアント側の外字設定がサーバ側と同じとは限らないからです。
> なるべく外字は避けるべきだと思います。
なるほど、外字は使用しないほうがいいのですね・・・

何か外字に対応する方法はないのでしょうか?

引用返信 編集キー/
■21052 / inTopicNo.15)  Re[8]: C#でPostgreSQLに接続
□投稿者/ ネタ好き (482回)-(2008/06/24(Tue) 08:40:01)
No21044 (alice さん) に返信
> ネタ好き さん、返信ありがとうございます。
>
>>外字はまずいです。
>>なぜならば、クライアント側の外字設定がサーバ側と同じとは限らないからです。
>>なるべく外字は避けるべきだと思います。
> なるほど、外字は使用しないほうがいいのですね・・・
>
> 何か外字に対応する方法はないのでしょうか?
>

うーん難しいですね・・・
フォントファイルを配布することになるんだろうけど、これが結構難しいと思います。
それに、配ったとしても上書きされてしまったら変なことになりますし・・・
引用返信 編集キー/
■21059 / inTopicNo.16)  Re[9]: C#でPostgreSQLに接続
□投稿者/ みきぬ (6回)-(2008/06/24(Tue) 10:13:56)
「その外字を入力した端末だけで見えればよい」という条件がつけば、可能なんじゃないですかねぇ。
あとは、DBやアプリなどで文字コードを変換しない作りにすれば。

# よくは知らないけど、途中で文字コードを変換しちゃうと、復元はおそらく無理ですよね?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -