2011-11-11 2 views
1

私はVB.NETをかなり新しくしていますので、バグに遭遇したときに多く研究します。問題は、私はこれに対する解決法、またはそれを遠隔的に扱う何かを見つけることができないということです。@(アットマーク)変数をMySQLに渡す

リモートのmysqlサーバに接続し、クエリを実行し、データセットを返すソフトウェアを開発しています。私は、mysqlプロンプトを介してサーバーに対してこのクエリを実行し、結果を正常に受信しました。しかし、私は私のアプリからこのクエリを実行しようとすると、私はオブジェクト参照エラーが発生します。

私は、SQL文字列の変数に使用されている@文字が私のコードで問題を引き起こしていることがわかりましたが、ビジュアルスタジオエラーをスローすることなくサーバーにこのクエリを渡す方法が見つかりません。私が見つけた変数の使用に対するすべての答えは、具体的には私のコードで変数値を規定していることを示唆しています。ここで

は私のコードと私の質問のビットです:

Dim mysqlCon As MySqlConnection = New MySqlConnection("Server=" & arrArgs & ";Database=DBNAME;Uid=USER;Pwd=PASS;allow zero datetime=true;") 
Dim mysqlString As String = "set @from_scanner = '" & code & "'; set @code='', @altbarcode='', @qty='1', @price='',@Altprice='0', @date_start='',@date_end='',@disc_price='0',@description='', @altdescription=''; set @from_scanner=if(left(@from_scanner,2)='FF',trim(substring(@from_Scanner,3,13)),trim(substring(@from_Scanner,2,13))); select code, altbarcode,description, qty, price into @code, @altbarcode,@altdescription, @qty, @Altprice from altbar where [email protected]_scanner; set @code=if(@code='',@from_Scanner,@code); select disc_price, date_end into @disc_price, @date_end from plu where (code=trim(left(@code,12)) or [email protected]) and current_date between date_start and date_end and disc_price<>price and disc_price<>0; select price, description into @price, @description from plu where code=trim(left(@code,12)) or [email protected]; set @price=if(ifnull(@disc_price,0)=0 or @disc_price='', @price,@disc_price); set @price=if(@qty>1 and @Altprice > 0, @Altprice, @price*@qty); set @description=if(@altdescription<>'', @Altdescription, @description); select @code, format(@price,2) Price, @description,@date_end;" 
Dim mysqlCom As MySqlCommand = New MySqlCommand(mysqlstring, mysqlCon) 
Dim mysqlAdapter As New MySqlDataAdapter 
Dim mysqlData As New DataSet 

mysqlCon.Open() 

mysqlAdapter.SelectCommand = mysqlCom 
mysqlAdapter.Fill(mysqlData, "tblDBData") 

だから私は本当に知っておくべきことをVBで問題を引き起こすことなくMySQLのサーバーにこのクエリを渡す方法です。

答えて

2

クエリ自体のフィールド名には、@が含まれていてはなりません。値で置き換えられる変数のみ。私は例として、表からupdatea行にあなたの非常に単純なSQLクエリを与える:

Dim sqlString as String = "UPDATE tableName SET [email protected] WHERE [email protected]" 

をこの場合はtableNameのは、あなたのテーブルの名前で、Disc_Priceはカラム名で、コードは、列名です。 Disc_Priceフィールドの値を、Code Fieldの@Codeと一致する1つまたは複数の行について、@Priceの値が何であるかを示すものに更新します。

はその後、コマンドを設定し、クエリパラメータを定義します。

Dim cmd As New MySqlCommand(sqlString, mysqlConn) 
cmd.Parameters.AddWithValue("@Price", 1.25) 
cmd.Parameters.AddWithValue("@Code",WhateverCodeHere) 

cmd.ExecuteNonQuery() 

は、あなたのパラメータ/クエリ内のSQL変数は、@を持っている、あなたは問題ないはずです確認してください。

あなたの文字列では、テーブル名とUPDATEキーワードがSETのクエリ文字列に含まれていないことに気付きました。

+0

クイックレスポンスを気に入ってください。 – user1041310

+0

私の問題は、私がサーバに渡す唯一の情報はスキャナからのアイテムコードであり、これをVB変数 "code"を通して送るということです。 クエリに対してmysql変数を作成しました。これは、クエリ自体がすべての作業を行い、データベースに対してクエリを実行している間にmysql変数を割り当て/再割り当てするためです。このようにして、mysqlサーバはすべての作業を行い、ただ一つのレコードをVBにデータセットとして提供します。 私はVBで変数の値を設定したくありません。私はmysqlに変数コンテナを渡し、クエリに値を入力させたいと思います。 – user1041310

+0

私はあなたが今何を意味するかを見ます。残念ながら、私はあなたが立ち往生していると思います。その場合、SQL変数をコード内のqueryString内のクエリで実際に置き換えなければならないことは確かです。申し訳ありませんが私はより多くの助けではなかった:( – Jay