• ベストアンサー
  • 困ってます

VBからのODBC接続でSQLエラー

DBバージョン:MySQL5 ODBCバージョン:ODBC3.51 言語:VB2003 を利用し VBからSQLを発行した際、1バイト文字の場合は問題はなく SQL文内に日本語を含むとハンドルされていない旨のシステムエラーが出てしまいます SQLAdminからStatusコマンドDBのキャラクタセット情報を確認してもSJISとして設定されており またコンソールから直接SQL文を打ち込んでも正常に動作いたします My.iniファイルも文字コードはSJISに置き換えてあり 何が原因かつかめません *VBコード Dim MyConString As String Dim MyConnection As OdbcConnection Dim strSQL As String Dim myOdbcCommand As OdbcCommand Dim iRet As String MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" + _ "SERVER=localhost;" + _ "PORT=3306;" + _ "DATABASE=kanri_db;" + _ "UID=xxxx;" + _ "PASSWORD=xxxx;" + _ "OPTION=3;" + _ "CHARSETENCODING=sjis" 'Connection MyConnection = New OdbcConnection(MyConString) 'myConn.Open() MyConnection.Open() Console.WriteLine("Connection State::" & MyConnection.State.ToString) 'SQL strSQL = "select csv_subitem from tbl_readtempcsv where csv_subitem='ワークグループ';" myOdbcCommand = MyConnection.CreateCommand myOdbcCommand = New OdbcCommand myOdbcCommand.Connection = MyConnection myOdbcCommand.CommandType = CommandType.Text myOdbcCommand.CommandText = strSQL iRet = myOdbcCommand.ExecuteNonQuery どなたかご教示いただけないでしょうか 宜しくお願いいたします

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数1254
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

my.iniのCLIENT SECTIONのdefault-character-setはMySQLが提供するクライアントアプリケーションのための設定です。そのため、ユーザ独自のクライアントアプリケーションは初期化時にキャラクタセットを設定する必要があります。  質問者さんのコードでは、CHARSETENCODINGというパラメータを指定していますが、マニュアルを読む限りMySQLのODBCにはそのパラメータは存在しません。  MySQLのODBCには STMT というパラメータがあり、ここに接続後に実行するステートメントを指定することができます。キャラクタセットを指定するステートメントは   set names sjis (もしくは set character set sjis) です。 コードの変更点としては "CHARSETENCODING=sjis" を "STMT=set names sjis" と変更することになります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

hirosa-ok様 有り難う御座います ご指摘いただいた内容で望んでいた動作の 確認が出来ました 誠に有り難う御座います

関連するQ&A

  • VB2008の文字列のエンコードについて

    環境:VB 2008 ExpressEdition SP1 データベース:MySQL5.0 上記の環境にて、カラムから文字列を取得しようとしているのですが 元々サーバー側のエンコードが今回作るアプリ専用に設計された訳ではなく、PHP等での閲覧に対応する為ににキャラクタセットをUTF-8で設計、運用しています。 ODBC3.51を用いて、データベースに接続しデータを取得しようとしているのですが、取得したデータが文字化けを起こしてしまいます。 Debug.Print(hoge)で出る、デバッグの文字列が ???? ?? となってしまいます。 文字列をエンコードする為の手立てをお教え願えませんでしょうか。 よろしくお願いいたします。 'SQLの設定 strsql = "SELECT * FROM HOGE" MyConnection.Open() Dim MyCommand As New OdbcCommand MyCommand.Connection = MyConnection MyCommand.CommandText = strsql Dim MyDataReader As OdbcDataReader MyDataReader = MyCommand.ExecuteReader While MyDataReader.Read() Debug.Print(CStr(MyDataReader("hoge"))) End While

  • C# を使って、ODBC経由でMySQLへアクセスしようと思い、あるサ

    C# を使って、ODBC経由でMySQLへアクセスしようと思い、あるサンプルを用いてアクセス をしました。 その結果としては、正しくアクセスでき、サンプル通りに動きましたが、どうもそれぞれの 記述の意味がつかめません。。。 下の記述の中の(1)~(4)のところの記述の意味を教えて頂ければと思います。 (1)に関しては OdbcConnectiion というのがどういう使い方をしているのかわからず。。。 初心者で申し訳ありません。教えて下さい。 //Connection string for Connector/ODBC 3.51 string MyConString = "DRIVER={MySQL ODBC 3.51 Driver};" + "SERVER=999.999.999.999;" + "DATABASE=TEST;" + "UID=TEST;" + "PASSWORD=******;" + "OPTION=3"; //Connect to MySQL using Connector/ODBC (1) OdbcConnection MyConnection = new OdbcConnection(MyConString); MyConnection.Open(); //Create a sample table OdbcCommand MyCommand = new OdbcCommand("DROP TABLE IF EXISTS my_odbc_net", MyConnection); (2) MyCommand.ExecuteNonQuery(); MyCommand.CommandText = "CREATE TABLE my_odbc_net(id int, name varchar(20), idb bigint)"; MyCommand.ExecuteNonQuery(); //Insert MyCommand.CommandText = "INSERT INTO my_odbc_net VALUES(10,'venu', 300)"; Console.WriteLine("INSERT, Total rows affected:" + MyCommand.ExecuteNonQuery()); ; //Fetch MyCommand.CommandText = "SELECT * FROM my_odbc_net"; (3) OdbcDataReader MyDataReader; (4) MyDataReader = MyCommand.ExecuteReader(); while (MyDataReader.Read()) { //Supported only by Connector/ODBC 3.51 Console.WriteLine("Data:" + MyDataReader.GetInt32(0) + " " + MyDataReader.GetString(1) + " " + MyDataReader.GetInt64(2)); }

  • ODBCでの接続方法

    1050YEN様、ご回答ありがとうございました。 実は「CreateWorkSpace」はクリアしたのですが、次の「OpenConnection」でエラーになってしまいました。 Dim datodbc As New DAO.DBEngine Dim wrkodbc As DAO.Workspace Dim conPubs As DAO.Connection Dim qdfTemp As DAO.QueryDef wrkodbc = datodbc.CreateWorkspace("", "Admin", "", "dbuserODBC") conPubs = wrkodbc.OpenConnection("", , , "ODBC;DSN=towaDS;") どなたか、ご存知の方がいらっしゃいましたら教えてください。 よろしくお願いいたします。

  • DataGridの使用方法を教えてください

    VB.NET2002で表形式で表示(参照のみ)させたいのですが,FlexGridはないようでDATAGridを使用するように書いてありましたが, DATAGridの使用方法がよく分かりません. どのような手順をふんでコードを記述するのか教えてください. 1,フォームにDATAGrid1を貼り付け. (ボタンも貼り付け,ボタンクリックでSQL実行,表示のイメージ) 2,Btn1_Clickに以下コード記述.色々参考にしていたらよく分からない状態になってしまいました... Q.フォームのプロパティでのデザインは必須なんでしょうか? Dim myConnection As New System.Data.OleDb.OleDbConnection(sConnectionString) Dim myCommand As New OleDb.OleDbCommand _ ("select * from データ", myConnection) Dim myReader As OleDb.OleDbDataReader Dim dst As New DataSet("Table") 'DataTable("DataTable") dst.Tables.Add(New DataTable("dst")) Dim dc As DataColumn myConnection.Open() myReader = myCommand.ExecuteReader 'データの読み込み While (myReader.Read) DataGrid1.DataSource = myReader.GetValue(0) End While DataGrid1.SetDataBinding(dst, "dst") myConnection.Close() myConnection = Nothing myReader.Close() myReader = Nothing myCommand = Nothing myConnection.Close() 'データベース閉じる myConnection = Nothing

  • ASP.NETで Web.Configの定義がエラーになります。

    Web.configに以下の定義 (フォームでSqlDataSouceを貼り付けて定義) <add name="TestdateConnectionString" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Inetpub\wwwroot\Test\App_Data\Test.mdb" providerName="System.Data.OleDb" /> 次にフォームのVB側で以下のサブルーチンを作成 (TestConnectionString)で定義がされていませんなる エラーがでます。定義はしているのですが何故でしょうか? 教えて下さいよろしくお願いいたします。 Protected Sub updateTimestamp(ByVal syouhinCD As String, ByVal updateFieldName As String, ByVal updateData As String) Using connection As New System.Data.Odbc.OdbcConnection(TestConnectionString) Dim updateCommand As String updateCommand = ("UPDATE Test SET {1} = Now(), {2} = 'dummy' WHERE({4} = 42)") Dim command As System.Data.Odbc.OdbcCommand = New System.Data.Odbc.OdbcCommand(updateCommand, connection) connection.Open() command.ExecuteNonQuery() connection.Close() End Using End Sub

  • ODBC接続について

    初歩的な質問で申し訳ないのですが、DAOのODBC接続で、 「CreateWorkSpace」で引数のログインIDとパスワードををいれなくてもODBCに接続ができて、データベースが読み込めました。「CreateWorkSpace」の引数でログインIDやパスワードを渡す意味と引数を渡さなかった場合の弊害があれば、教えてください。 よろしくお願いいたします。 Dim datodbc As New DAO.DBEngine Dim wrkodbc As DAO.Workspace Dim conPubs As DAO.Connection Dim qdfTemp As DAO.QueryDef wrkodbc = datodbc.CreateWorkspace("", "", "", DAO.WorkspaceTypeEnum.dbUseODBC)

  • Oracleへの接続について

    OS:WindowsWp 言語:Visual Studio 2005 Visual Basic データベース:Oracle10g ご教授願います。 1つのクラスでデータベースへの接続メソッド・SQL文発行メソッド、切断メソッドを実装し、それらを状況に応じて呼び出し、データの取得を行いたいと考えております。 以下、ソースです。 --------クラスここから Public Class ConnectOracle  Public myConnection as New OracleConnection  Public Sub ConnectDB()・・・(1)   myConnection.ConnectionString = "User ID=scott;Password=tiger;Data Source=orcl"   myConnection.Open()  End Sub  Public Sub SqlDB()・・・(2)   Dim cmd As OracleCommand = New OracleCommand("SELECT * FROM EMP")   cmd.Connection = myConnection   cmd.CommandType = CommandType.Text   Dim reader As OracleDataReader = cmd.ExecuteReader()   ・・・・  End Sub  Public Sub DisConnectDB()・・・(3)   myConnection.Close()  End Sub --------クラスここまで Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  Dim Conn As New ConnectOracle・・・上記のクラス  Conn.ConnectDB()・・・(4)  Conn.SqlDB()・・・(5)  Conn.DisConnectDB()・・・(6) End Sub (4)実行でOracleに接続が行われ、クローズしていないのに、(5)を実行したときにはデータベースへの接続が切断されました。実装方法がおかしいでしょうか?

  • SQLデータベースへのアクセスがわからない

    VB.Netを始めて一ヶ月。 DB接続は出来たもののREADのみで、更新処理が全く出来ません。 何が悪いのか、どうすればいいのかもわからず途方に暮れています。 どなたかお知恵をお貸し下さい。 下記にプログラムを記載します。 ■◇■ 共通定数 ■◇■ Public gstrSysd As String = "DSN=DbName;UID=UserId;PWD=Password" 一部名称を変更しています。 ■◇■ Readプログラム ■◇■ Public Sub psubDBReadK(ByVal strSql As String, Optional ByVal intDcnt As Integer = 0)   Dim godbSysd As New OdbcConnection(gstrSysd)   godbSysd.Open()   Dim odbCom As New OdbcCommand(strSql, godbSysd)   Dim odbRead As OdbcDataReader = odbCom.ExecuteReader(CommandBehavior.CloseConnection)   Dim intLcnt As Integer   Erase gtblDb   glngDcnt = 0   While odbRead.Read()     glngDcnt = glngDcnt + 1     ReDim Preserve gtblDb(intDcnt, glngDcnt)     For intLcnt = 1 To intDcnt       If IsDBNull(odbRead.GetValue(intLcnt - 1)) Then         gtblDb(intLcnt, glngDcnt) = ""       Else         gtblDb(intLcnt, glngDcnt) = Trim(odbRead.GetString(intLcnt - 1))       End If     Next intLcnt   End While   odbRead.Close()   godbSysd.Close() End Sub 上記モジュールをSQL文を作成してCallします。   strSql = ""   strSql = strSql & "SELECT Mm, Wd, Dd, Nm "   strSql = strSql & " FROM TableName "   strSql = strSql & "WHERE Fd <= '" & lngYear & "' "   strSql = strSql & " AND Ed >= '" & lngYear & "' "   strSql = strSql & "ORDER BY Mm, Wd, Dd "   Call psubDBReadK(strSql, 4) ここまでは動作確認も出来ましたが、問題はWRITE処理です。 ■◇■ WRITEプログラム ■◇■ Public Sub psubDbWriteK(ByVal strSql As String)   Dim odbSysd As New OdbcConnection(gstrSysd)   odbSysd.Open()   Dim odbCom As New OdbcCommand(strSql, odbSysd)   odbCom.Connection.Open()   odbCom.ExecuteNonQuery()   odbSysd.Close() End Sub 上記コードだとコネクションのオープン時に『既に開かれています』のエラーとなりました。 同コードを削除するとエグゼキュートノンクエリーにて『システムエラー』となり、やはり上手く動作していないようです。 同様にOdbcDataAdapterを使う方法も試してみましたが上手くいきませんでした。 DBアクセスの方法はいくつかあると思いますが、SELECT句と同様の方法でINSERT、UPDATEも行いたいのですが、どうすれば良いのでしょうか? 環境 OS WIN2K VS.Net Professional(VB) DB SqlServer2K

  • ODBC使用時の正しい記述方法

    データベース初心者です。 ODBCの正しい記述方法についてご教示願います。 以下のソースでデータベース間のテーブルコピーを試したところができるものとできないものがあります。 テーブルはすべて作成済み、Windows認証です。  環境 OS:WidowsXp、Access2003、Excel2007、SQL ServerExpress2008 (1)SQL Server ⇒ SQL Server  記述の方法に問題があるようなメッセージです。  ドライバやテーブルの指定が同様な記述で(4)や(5)がOKなのに(1)ではNGです。DRIVER指定ができないようです。 エラーメッセージ "[Microsoft][ODBC SQL Server Driver][SQL Server]オブジェクト名 'odbc;DRIVER=SQL Server;Server=Server1\\SQLEXPRESS2;Database=TEST1;Integrated Security=SSPI;.TABLE1' が無効です。" (2)は仕様上出来ないのでしょうか? エラーメッセージ "[Microsoft][ODBC Microsoft Access Driver] ODBC を使用して、外部 Microsoft Jet データベース エンジンのテーブルや組み込み可能な ISAM データベースのテーブルのインポート、エクスポート、またはリンクを行うことはできません。" 実用上はOLEを使用しているので問題はありませんが、向学のためによろしくお願いします。 /////////////////////////// ソース ///////////////////////////////////// (1)SQL Server ⇒ SQL Server 動作NG Sub sqlsvr2sqlsvr() Dim cn As New ADODB.Connection Dim strSQL As String cn.Open "DRIVER={SQL Server};Server=Server1\SQLEXPRESS1;Database=TEST1" strSQL = "INSERT INTO [odbc;DRIVER=SQL Server;" & _ "Server=Server1\SQLEXPRESS2;Database=TEST1;" & _ "Integrated Security=SSPI;].TABLE1 " & _ "SELECT * FROM TABLE1" cn.Execute strSQL cn.Close Set cn = Nothing End Sub (2)Excel ⇒ Access 動作NG Sub Access2Excel() Dim cn As New ADODB.Connection Dim strSQL As String cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:\TEST1.MDB" strSQL = "INSERT INTO [DRIVER={Microsoft Excel Driver (*.xls)};" & _ "DBQ=C:\TestBook.xls;ReadOnly=False].[Sheet1$] " & _ "SELECT * FROM TABLE1" cn.Execute strSQL cn.Close Set cn = Nothing End Sub (3)Excel ⇒ Excel 動作OK Sub Excel2Excel() Dim cn As New ADODB.Connection Dim strSQL As String cn.Open "odbc;DRIVER={Microsoft Excel Driver (*.xls)};DBQ=C:\TestBook.xls;ReadOnly=False;" strSQL = "INSERT INTO [C:\TestBook2.xls].[Sheet1$]" & _ "SELECT * FROM [Sheet1$]" cn.Execute strSQL cn.Close Set cn = Nothing End Sub (4)Access ⇒ SQL Server 動作OK Sub access2sqlsvr() Dim cn As New ADODB.Connection Dim strSQL As String cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:\TEST0.MDB" strSQL = "INSERT INTO [odbc;DRIVER=SQL Server;" & _ "Server=Server1\SQLEXPRESS1;Database=TEST1;" & _ "Integrated Security=SSPI;].TABLE1 " & _ "SELECT * FROM TABLE1" cn.Execute strSQL cn.Close Set cn = Nothing End Sub (5)Excel ⇒ SQL Server 動作OK Sub excel2sqlsvr() Dim cn As New ADODB.Connection Dim strSQL As String cn.Open "DRIVER={Microsoft Excel Driver (*.xls)};DBQ=C:\TestBook.xls;ReadOnly=False;" strSQL = "INSERT INTO [odbc;DRIVER=SQL Server;" & _ "Server=Server1\SQLEXPRESS1;Database=TEST1;" & _ "Integrated Security=SSPI;].TABLE1 " & _ "SELECT * FROM [Sheet1$]" cn.Execute strSQL cn.Close Set cn = Nothing End Sub (6)Access ⇒ Access 動作OK Sub Access2Access() Dim cn As New ADODB.Connection Dim strSQL As String cn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:\TEST0.MDB" strSQL = "INSERT INTO T_写真台帳1 SELECT * FROM [C:TEST1.MDB].T_写真台帳" cn.Execute strSQL cn.Close Set cn = Nothing End Sub

  • PowerShellからODBC接続してSQL実行

    PowerShellからORACLEにODBC接続してSQL実行しています。 抜粋となりますが、以下の処理をしていますが、データの取得で エラーが発生し、どうしてもORACLEのDBから抽出できません。 [void][System.Reflection.Assembly]::LoadWithPartialName("System.Data") $connectionString="DSN=xxxxx;uid=xxxxx;pwd=xxxxx;" $conn = New-Object System.Data.Odbc.OdbcConnection($connectionString) $odbcCommand = New-Object System.Data.Odbc.OdbcCommand $odbcCommand.Connection = $conn $sql = "select sysdba from dual" $odbcCommand.CommandText = $sql $dataAdapter = New-Object System.Data.Odbc.OdbcDataAdapter $dataAdapter.SelectCommand = $odbcCommand $dataSet = New-Object System.Data.DataSet $nRecs = $dataAdapter.Fill($dataSet) "1" 個の引数を指定して "Fill" を呼び出し中に例外が発生しました: "算術演算の結果オーバーフローが発生しました。" 発生場所 行:1 文字:27 + $nRecs = $dataAdapter.Fill <<<< ($dataSet) + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException DataSetに格納でエラーとなったので、ExecuteReaderに変えて実行。 上記、処理に $conn.Open() を追加し、 $odbcReader = $odbcCommand.ExecuteReader() "0" 個の引数を指定して "ExecuteReader" を呼び出し中に例外が発生しました: "算術演算の結果オーバーフローが発生しました。" 発生場所 行:1 文字:41 + $odbcReader = $odbcCommand.ExecuteReader <<<< () + CategoryInfo : NotSpecified: (:) []、MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException と、DataSetを使おうが、ExecuteReaderを使おうが同じエラーが発生した。 何が原因で発生しているのでしょうか。 また、対処はどのようにしたらよいのでしょうか。 お願いします。 環境 ・Windows7 64ビット ・64ビット oracle client 11gR2 ・sqlnet.ora、tnsnames.ora を作成 ・odbcデータソース作成  TNSサービス名には、tnsnames.ora にあるサービス名を指定