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

  • 質問

  • Visual Studio2005 Proffesional Editionを使ってASP.netでAというデータベースへ接続し、検索した後に目的のデータを取り出すと言うことをしたいのですが、(今勉強中なもので、説明がうまくありませんがよろしくお願いします。)

    SELECT文を使ってAデータベースからデータを取り出すと言うところはうまくいきました。

     

    さらにそのデータを使って別のBというデータベースを検索し、目的のデータを取得したいのですが、件名のような、

    「インデックスを付加するキーには 2 値が必要ですが、1 値を取得しました。」というエラーメッセージがでます。

     

    Bデータベースにはprimary keyを一つしか設定していないのですが、なぜこのようなメッセージが出るのでしょうか?

     

    Bデータベースを検索するときに一つのキーワードだけで検索したいのですが、二つ検索キーワードを設定しないといけないと言うことなのでしょうか?

     

    わかりづらい説明で恐縮ですが、どなたかよろしくお願いいたします。

    2008年2月14日 9:27

回答

  • 複合キー(連結キー)を使ってませんか?

     

    Bテーブルを検索するのは、どのようなコードを書いておられますか?

    Findですかね。その部分を教えてください。

    2008年2月14日 9:51
  • う~ん、わかりません。(^^;

    地道に調べていくしかないかも。

     

    >finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)

    ds.Tables("Bdatabase").Findbyほにゃらら と言うメソッドがあると思いますが、

    ほにゃららの部分は何が書かれてますか?

    2008年2月15日 0:55
  • いえ、

    ds.Tables("Bdatabase").

    とピリオドまで打つと候補が出てくると思います。

    その候補の中にFindbyで始まる名前のメソッドがありませんか?

    2008年2月15日 1:13
  • 型指定のないデータセットですかね?

    データセットの中身見る方法わかりますか?

    ソリューションエクスプローラで、データセット名.xsdのファイルをダブルクリックです。

    それでテーブルに主キーの鍵マークとかないのでしょうか?

     

    データセットとテーブルをどのように作成されたのか、聞かないといけないかも。

    2008年2月15日 1:26
  •  ソルピー さんからの引用

    応用して

    Select("code = findkey1")と、code=列名、findkey1=変数としたいのですが、

    Select("code = 'findkey1'")という書き方でいいのでしょうか?

     

    データがあるものでテストしているのですが、結果がlength=0になってしまい、データがとれていない気がします。

     

    Length=0ということはエラーは出なくなったのですね。

    Select("code=" & findkey1)でやってみてください。

    シングルクオーテーションはいらなかったと思うけど、長らくSQLやってないので自信なし。

    2008年2月15日 7:39
  •  ソルピー さんからの引用

    やってみましたが、変化無しでした。(泣)

    変化なしとは、エラーは出ず、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つの値は、それぞれどの列に相当する値がはいっていますか?

     

    全体的に、こういうコードを書いたら、こういう結果になった、ということを

    誰にでもわかるように書いてもらえると助かります。

    2008年2月15日 8:10
  • 私から言えることはもうあまりないのですが、2個目のエラーについてだけ。

     

    dim finddr as datarow

    とすると、おそらくデフォルトプロパティがItemなのでしょう、

    finddr.Item(0)の省略形がfinddr(0)

     

    dim finddr() as datarow

    とすると、配列の宣言となり、

    finddr(0)は配列の最初のdatarow

     

    と言う事では。

    2008年2月15日 12:44

すべての返信

  • 複合キー(連結キー)を使ってませんか?

     

    Bテーブルを検索するのは、どのようなコードを書いておられますか?

    Findですかね。その部分を教えてください。

    2008年2月14日 9:51
  • はなはなはなさん、お返事ありがとうございます。

     

    複合キーとは、検索して調べましたら

    「組み合わせて主キーとして扱える列のことを,「連結キー」あるいは「複合キー」という」

    ということでしたら、使っていないと思います。

     

    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には目的の値が入っています。

     

    よろしくお願いいたします。

    2008年2月14日 23:30
  • すみません、SELECT文を書き間違えました。

     

    cmd.CommandText = "SELECT Adatabase FROM code WHERE code1='" & code2 & "'"

    ではなく

     

    cmd.CommandText = "SELECT Code FROM Adatabase WHERE codeA='" & hincode & "'"  

     

    です。

    よろしくお願いいたします。

    2008年2月15日 0:46
  • う~ん、わかりません。(^^;

    地道に調べていくしかないかも。

     

    >finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)

    ds.Tables("Bdatabase").Findbyほにゃらら と言うメソッドがあると思いますが、

    ほにゃららの部分は何が書かれてますか?

    2008年2月15日 0:55
  • はなはなはなさんありがとうございます。

     

    取得したデータのことでしょうか?

     

    Aデータベースから取得したコード(4桁の文字列型のデータ)が入っています。

     

    これは正しく目的のデータが入っています。

     

    よろしくお願いいたします。

    2008年2月15日 1:04
  • いえ、

    ds.Tables("Bdatabase").

    とピリオドまで打つと候補が出てくると思います。

    その候補の中にFindbyで始まる名前のメソッドがありませんか?

    2008年2月15日 1:13
  • はなはなはなさん。ありがとうございます。

     

    試してみましたが、findbyもfindも出てきません。

    よろしくお願いいたします。

     

    2008年2月15日 1:18
  • 型指定のないデータセットですかね?

    データセットの中身見る方法わかりますか?

    ソリューションエクスプローラで、データセット名.xsdのファイルをダブルクリックです。

    それでテーブルに主キーの鍵マークとかないのでしょうか?

     

    データセットとテーブルをどのように作成されたのか、聞かないといけないかも。

    2008年2月15日 1:26
  • はなはなはなさん。ありがとうございます。

     

    ソリューションエクスプローラで、データセット名.xsdのファイルというものが見つかりませんでした。

     

    すみません、書き方を間違えていました。

    データベースは同じでその中にあるAテーブルとBテーブルです。

     

    AテーブルとBテーブルにはそれぞれ、あるコードのところに一つずつの主キー(鍵マークが付いています)を付けています。(コードの種類は違うものです)

     

    Aテーブルは商品のコード一覧のようなテーブルで、一つの製品について色んなコードが付いているものをまとめたものになっています。

     

    Aテーブルから主キーじゃないコードa-aを元に、コードa-bを検索してそのコードa-bを元に、Bテーブルからそのコードa-bの行があるかを検索したいのです。

     

     

    データセットはVisualStudioでサーバエクスプローラーのツールから追加し、テーブルはMicrosftSQLServer Management Studio Expressというソフトを使って、テーブルを作成しました。

     

    このような説明でおわかりになりますでしょうか?

     

    よろしくお願いいたします。

    2008年2月15日 1:53
  • すみません、言い方が悪かったです。データベース内のテーブルの作り方ではなくて、

    データセット内のデータテーブルの作り方を聞きたかったのです。

     

    Dim finddr() As DataRow
    finddr = ds.Tables("Bdatabase").Select("code=1")

     

    のようにすればできるかとは思いますが、当初のエラーが出る理由は依然不明です。

    2008年2月15日 2:21
  • はなはなはなさん。ありがとうございます。

     

    データセット内のデータテーブルの作り方というのは、すみません。よくわからないのですが、ツールから引っ張ってきて設定して・・・ということでしょうか?それともプログラムの作り方でしょうか?

    よくわかっていなくて大変申し訳ありません。。。

     

     

    Dim finddr() As DataRow
    finddr = ds.Tables("Bdatabase").Select("code=1")

     

    教えて頂いたように入れてみましたが、

    型'system.data.datarowの一次元配列'の値を'system.data.datarow'に変換できませんというエラーが出ます。

     

    finddr = ds.Tables("Bdatabase").Select("code=1")

    ↑この部分全体でエラーが出ます。

     

    よろしくお願いいたします。

    2008年2月15日 2:39
  • ちょっとデータテーブルのほうはおいといて、(^^;

     

     ソルピー さんからの引用

    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 Snippet

    Dim finddr() as datarow

     

     

    と定義すればそのエラーはでないはずなのですが。

    配列で定義します。

     

    ちっとも解決しなくてすみません。。。

    2008年2月15日 6:04
  • はなはなはなさん。ありがとうございます。

     

    教えて頂いたように修正してみたのですが、うまくいきません。。(泣)

     

    応用して

    Select("code = findkey1")と、code=列名、findkey1=変数としたいのですが、

    Select("code = 'findkey1'")という書き方でいいのでしょうか?

     

    データがあるものでテストしているのですが、結果がlength=0になってしまい、データがとれていない気がします。

     

    変な質問をしていましたらすみません。

     

    よろしくお願いいたします。

    2008年2月15日 7:27
  •  ソルピー さんからの引用

    応用して

    Select("code = findkey1")と、code=列名、findkey1=変数としたいのですが、

    Select("code = 'findkey1'")という書き方でいいのでしょうか?

     

    データがあるものでテストしているのですが、結果がlength=0になってしまい、データがとれていない気がします。

     

    Length=0ということはエラーは出なくなったのですね。

    Select("code=" & findkey1)でやってみてください。

    シングルクオーテーションはいらなかったと思うけど、長らくSQLやってないので自信なし。

    2008年2月15日 7:39
  • はなはなはなさん。ありがとうございます。

     

    やってみましたが、変化無しでした。(泣)

     

    また、出てきた結果から、

     finddr1(2) = finddr1(2) + 100

     

    このような計算もしたいのですが、

    演算子+は型system.data.datarow及びintegerに対して定義されていませんというエラーが出て実行できません。

     

    これと全く同じような式と、一番最初のこの式

    finddr = ds.Tables("Bdatabase").Rows.Find(findkey1)

     

    を別のテーブルを使って全く同じようにやっているのですが、こちらは全然問題なく動きます

    (動く方は、findkey1が配列で2つの値が入っています)

     

    なぜかこのテーブルを使った場合だけうまく動きません。

     

    申し訳ありませんがよろしくお願いいたします。

    2008年2月15日 7:56
  •  ソルピー さんからの引用

    やってみましたが、変化無しでした。(泣)

    変化なしとは、エラーは出ず、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つの値は、それぞれどの列に相当する値がはいっていますか?

     

    全体的に、こういうコードを書いたら、こういう結果になった、ということを

    誰にでもわかるように書いてもらえると助かります。

    2008年2月15日 8:10
  • はなはなはなさん。ありがとうございます。

     

    はい、変化無しというのはエラーは出ないのですが、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を検索して一致するデータがあればデータを足していくというものです。

     

     

    わからないところがありましたら教えてください。

    同じような感じだと思うのですが、なぜ動かないのかわかりません。

     

    よろしくお願いいたします。

    2008年2月15日 8:50
  • 私から言えることはもうあまりないのですが、2個目のエラーについてだけ。

     

    dim finddr as datarow

    とすると、おそらくデフォルトプロパティがItemなのでしょう、

    finddr.Item(0)の省略形がfinddr(0)

     

    dim finddr() as datarow

    とすると、配列の宣言となり、

    finddr(0)は配列の最初のdatarow

     

    と言う事では。

    2008年2月15日 12:44
  • はなはなはなさん。ありがとうございます。

     

    自分なりにいろいろやってみて返事をするのが遅くなって申し訳ありません。

     

    まだ解決していなく、行き詰まっている状態ですが、

    はなはなはなさんに教えて頂いたことを元にもう少しやってみたいと思います。

     

    ありがとうございました。

    2008年2月20日 2:10
  • こんにちは。中川俊輔 です。

     

    はなはなはなさん、親切な回答ありがとうございます。

     

    ソルピーさん、フォーラムのご利用ありがとうございます。

    有用な情報と思われたため、はなはなはなさんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    ソルピーさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年3月21日 9:10