トップ回答者
インデックスを付加するキーには 2 値が必要ですが、1 値を取得しました。というエラーが出ます

質問
-
Visual Studio2005 Proffesional Editionを使ってASP.netでAというデータベースへ接続し、検索した後に目的のデータを取り出すと言うことをしたいのですが、(今勉強中なもので、説明がうまくありませんがよろしくお願いします。)
SELECT文を使ってAデータベースからデータを取り出すと言うところはうまくいきました。
さらにそのデータを使って別のBというデータベースを検索し、目的のデータを取得したいのですが、件名のような、
「インデックスを付加するキーには 2 値が必要ですが、1 値を取得しました。」というエラーメッセージがでます。
Bデータベースにはprimary keyを一つしか設定していないのですが、なぜこのようなメッセージが出るのでしょうか?
Bデータベースを検索するときに一つのキーワードだけで検索したいのですが、二つ検索キーワードを設定しないといけないと言うことなのでしょうか?
わかりづらい説明で恐縮ですが、どなたかよろしくお願いいたします。
回答
-
ソルピー さんからの引用 応用して
Select("code = findkey1")と、code=列名、findkey1=変数としたいのですが、
Select("code = 'findkey1'")という書き方でいいのでしょうか?
データがあるものでテストしているのですが、結果がlength=0になってしまい、データがとれていない気がします。
Length=0ということはエラーは出なくなったのですね。
Select("code=" & findkey1)でやってみてください。
シングルクオーテーションはいらなかったと思うけど、長らくSQLやってないので自信なし。
-
ソルピー さんからの引用 やってみましたが、変化無しでした。(泣)
変化なしとは、エラーは出ず、Length=0のままということでしょうか?
ソルピー さんからの引用 また、出てきた結果から、
finddr1(2) = finddr1(2) + 100
このような計算もしたいのですが、
演算子+は型system.data.datarow及びintegerに対して定義されていませんというエラーが出て実行できません。
finddr1はdatarowですから演算はできません。
列の値はfinddr1(2).item(0)のように取り出します。
ただの例で書かれたのかもしれませんが、インデックスが2ということは、条件文に指定した列は
主キーではないと思われます。
ソルピー さんからの引用 これと全く同じような式と、一番最初のこの式
finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)
を別のテーブルを使って全く同じようにやっているのですが、こちらは全然問題なく動きます
(動く方は、findkey1が配列で2つの値が入っています)
なぜかこのテーブルを使った場合だけうまく動きません。
ん、findkey1が配列で2つの値が入っている、ということは複合キーだと思いますが。
動くテーブルの構造を教えてください。
あと、findkey1の配列の2つの値は、それぞれどの列に相当する値がはいっていますか?
全体的に、こういうコードを書いたら、こういう結果になった、ということを
誰にでもわかるように書いてもらえると助かります。
すべての返信
-
はなはなはなさん、お返事ありがとうございます。
複合キーとは、検索して調べましたら
「組み合わせて主キーとして扱える列のことを,「連結キー」あるいは「複合キー」という」
ということでしたら、使っていないと思います。
Bデータベースには、コード、商品名、在庫数の列があり、コードにだけprimarykeyを付けています。
要約したものですが
'Aデータベースから検索コード取得
cmd.CommandText = "SELECT Adatabase FROM code WHERE code1='" & code2 & "'"
cn.Open()
dread = cmd.ExecuteReader()
If dread.Read <> False Then
findkey1 = dread(0)
End If
cn.Close()'↓ここで引っかかる
finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)このような感じで作成しています。
findkey1には目的の値が入っています。
よろしくお願いいたします。
-
はなはなはなさん。ありがとうございます。
ソリューションエクスプローラで、データセット名.xsdのファイルというものが見つかりませんでした。
すみません、書き方を間違えていました。
データベースは同じでその中にあるAテーブルとBテーブルです。
AテーブルとBテーブルにはそれぞれ、あるコードのところに一つずつの主キー(鍵マークが付いています)を付けています。(コードの種類は違うものです)
Aテーブルは商品のコード一覧のようなテーブルで、一つの製品について色んなコードが付いているものをまとめたものになっています。
Aテーブルから主キーじゃないコードa-aを元に、コードa-bを検索してそのコードa-bを元に、Bテーブルからそのコードa-bの行があるかを検索したいのです。
データセットはVisualStudioでサーバエクスプローラーのツールから追加し、テーブルはMicrosftSQLServer Management Studio Expressというソフトを使って、テーブルを作成しました。
このような説明でおわかりになりますでしょうか?
よろしくお願いいたします。
-
はなはなはなさん。ありがとうございます。
データセット内のデータテーブルの作り方というのは、すみません。よくわからないのですが、ツールから引っ張ってきて設定して・・・ということでしょうか?それともプログラムの作り方でしょうか?
よくわかっていなくて大変申し訳ありません。。。
Dim finddr() As DataRow
finddr = ds.Tables("Bdatabase").Select("code=1")教えて頂いたように入れてみましたが、
型'system.data.datarowの一次元配列'の値を'system.data.datarow'に変換できませんというエラーが出ます。
finddr = ds.Tables("Bdatabase").Select("code=1")
↑この部分全体でエラーが出ます。
よろしくお願いいたします。
-
ちょっとデータテーブルのほうはおいといて、(^^;
ソルピー さんからの引用 Dim finddr() As DataRow
finddr = ds.Tables("Bdatabase").Select("code=1")教えて頂いたように入れてみましたが、
型'system.data.datarowの一次元配列'の値を'system.data.datarow'に変換できませんというエラーが出ます。
finddr = ds.Tables("Bdatabase").Select("code=1")
↑この部分全体でエラーが出ます。
Code SnippetDim finddr() as datarow
と定義すればそのエラーはでないはずなのですが。
配列で定義します。
ちっとも解決しなくてすみません。。。
-
ソルピー さんからの引用 応用して
Select("code = findkey1")と、code=列名、findkey1=変数としたいのですが、
Select("code = 'findkey1'")という書き方でいいのでしょうか?
データがあるものでテストしているのですが、結果がlength=0になってしまい、データがとれていない気がします。
Length=0ということはエラーは出なくなったのですね。
Select("code=" & findkey1)でやってみてください。
シングルクオーテーションはいらなかったと思うけど、長らくSQLやってないので自信なし。
-
はなはなはなさん。ありがとうございます。
やってみましたが、変化無しでした。(泣)
また、出てきた結果から、
finddr1(2) = finddr1(2) + 100
このような計算もしたいのですが、
演算子+は型system.data.datarow及びintegerに対して定義されていませんというエラーが出て実行できません。
これと全く同じような式と、一番最初のこの式
finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)
を別のテーブルを使って全く同じようにやっているのですが、こちらは全然問題なく動きます
(動く方は、findkey1が配列で2つの値が入っています)
なぜかこのテーブルを使った場合だけうまく動きません。
申し訳ありませんがよろしくお願いいたします。
-
ソルピー さんからの引用 やってみましたが、変化無しでした。(泣)
変化なしとは、エラーは出ず、Length=0のままということでしょうか?
ソルピー さんからの引用 また、出てきた結果から、
finddr1(2) = finddr1(2) + 100
このような計算もしたいのですが、
演算子+は型system.data.datarow及びintegerに対して定義されていませんというエラーが出て実行できません。
finddr1はdatarowですから演算はできません。
列の値はfinddr1(2).item(0)のように取り出します。
ただの例で書かれたのかもしれませんが、インデックスが2ということは、条件文に指定した列は
主キーではないと思われます。
ソルピー さんからの引用 これと全く同じような式と、一番最初のこの式
finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)
を別のテーブルを使って全く同じようにやっているのですが、こちらは全然問題なく動きます
(動く方は、findkey1が配列で2つの値が入っています)
なぜかこのテーブルを使った場合だけうまく動きません。
ん、findkey1が配列で2つの値が入っている、ということは複合キーだと思いますが。
動くテーブルの構造を教えてください。
あと、findkey1の配列の2つの値は、それぞれどの列に相当する値がはいっていますか?
全体的に、こういうコードを書いたら、こういう結果になった、ということを
誰にでもわかるように書いてもらえると助かります。
-
はなはなはなさん。ありがとうございます。
はい、変化無しというのはエラーは出ないのですが、Length=0のままです。
すみません、できるだけわかりやすく書いてみます。
動く方のプログラムは下記です。(途中省略してあります)
Dim findkey(1) , zaiko(4), code(j), lot(j) As Object
da.FillSchema(ds, SchemaType.Source, "Atable")
da.Fill(ds, "Atable")For j = 0 To 4
findkey(0) = code(j) 'コード ←コードとロットはテキストボックスから入力された値です
findkey(1) = lot(j) 'ロットfinddr = ds.Tables("Atable").Rows.Find(findkey)
If finddr Is Nothing Then
Else
finddr(3) = finddr(3) + zaiko(j) ←在庫数はテキストボックスから入力された値です
End If
next
↑この状態で希望通り動きます。(検索結果から計算します)
code(j),lot(j),zaiko(j)は0から4まで配列で値を入れてあります。
テキストボックスから入力されたコードとロットの値でテーブルを検索し、一致するものがあれば在庫数データを足していくというものです。
---------------------------------------------
動かないものはこちらです。変数の定義省略
(最初の式に戻してあります)
da.FillSchema(ds, SchemaType.Source, "Btable")
da.Fill(ds, "Btable")cmd.CommandText = "SELECT Code FROM Ctable WHERE aCode='" & bCode & "'"
cn.Open()
dread = cmd.ExecuteReader()
If dread.Read <> False Then
findkey1 = dread(0) ←Ctableのコード一つの値が希望通り入っています
Else
findkey1 = ""
End If
cn.Close()finddr1 = ds.Tables("Dtable").Rows.Find(findkey1) 一つのコードでDtableを検索します。
↑インデックスを付加するキーには 2 値が必要ですが、1 値を取得しました。というエラーが出ます
If finddr1 Is Nothing Then
Else
finddr1(2) = finddr1(2) + 100
↑演算子+は型system.data.datarow及びintegerに対して定義されていませんというエラーが出て実行できません。
End If
Ctableからあるコードを元に検索をしてその製品についている別のコードを出し、その出したコードを元にDtableを検索して一致するデータがあればデータを足していくというものです。
わからないところがありましたら教えてください。
同じような感じだと思うのですが、なぜ動かないのかわかりません。
よろしくお願いいたします。