人に聞けない痔の悩み、これでスッキリ >>

VB2005、SQLServer2005環境です。
主キーの設定方法について教えて下さい。
主キーが一つの場合下記のように記述しますが、複数ある場合はどう記述すればよろしいですか?
お願いします。

strsql = "SELECT * FROM Aテーブル"
Dim comm As SqlCommand = New SqlCommand(strsql, Con)
Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm)
Dim ds As DataSet = New DataSet()
dataadapter.Fill(ds, "Aテーブル")
Dim dt As New DataTable
dt = ds.Tables("Aテーブル")
'主キーの設定
dt.PrimaryKey = New DataColumn() {dt.Columns("コード1")}

このQ&Aに関連する最新のQ&A

A 回答 (4件)

既に回答がついていますが補足。


要するに
dt.PrimaryKey = New DataColumn() {dt.Columns("コード1"), dt.Columns("コード2")}
とすると、コード1 + コード2 の主キーが作成されます。

表題から、主キーそのものを複数個設定したいように読めるのですが、主キーというのは、1テーブルにつき1つしか設定できません、念のため。
    • good
    • 1
この回答へのお礼

主キーって1テーブルにつき1つ???
いくつでも設定できると思うんですが、DATASETには一つということなんでしょうか?
主キーの作成方法はわかりました。
ありがとうございました。

お礼日時:2008/09/02 17:14

「主キーが複数」という「言い方」が良くないだけかも。


「複数カラムの組で主キーを構成している」とか言った方が良いかも。
    • good
    • 0
この回答へのお礼

そういうことでしたらわかりました。
例えば、市町村テーブルに都道府県コード、市町村コード、市町村名のフィールドがあり、都道府県コード、市町村コードを主キーにしていたら、それは複数主キーがあるのではと思ってました。
ありがとうございました。

お礼日時:2008/09/04 08:52

>いくつでも設定できると思うんですが、DATASETには一つということなんでしょうか?



逆にいくつでも設定できるという情報はどこから得ましたか?
出展を教えてください。

主キーとは、テーブル内の複数レコードの中から1つのレコードを特定できるキーで、1テーブルに1つ設定できます。
DataSet 内には複数の DataTable を格納でき、DataTable 毎に1つ主キーが設定できますから、DataSet 内には複数の主キーが存在し得るという事は言えます。
    • good
    • 0

>dt.PrimaryKey = New DataColumn() {dt.Columns("コード1")}



DataColumnを配列で定義しているのだから、必要なキーの数だけ配列の中身を定義してあげるだけですよ。

この回答への補足

dt.PrimaryKey = New DataColumn() {dt.Columns("コード1")}
dt.PrimaryKey = New DataColumn() {dt.Columns("コード2")}
dt.PrimaryKey = New DataColumn() {dt.Columns("コード3")}
と書くという意味ですか?

補足日時:2008/09/02 17:05
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

QDataGridViewの特定列に入力されている重複チェックをしたい

VisualBasic2005です。
例えばDataGridViewの3列目にコードが入力されるとします。
その列のコードには重複入力をさせたくないのです。

重複チェックをするのは、そのセルの入力が確定したときでも、
特定のボタンが押されたときでもかまわないので、
チェックする方法はないでしょうか?

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

Aベストアンサー

そのDataGridViewはDataTableをバインドしてますか?
もしそうなら、DataTableの方で重複をさせたくない列を主キーに設定すれば、重複値を入力したときエラーがでるようになります。
主キーの設定の仕方は例えば
'dtはDataTable
dt.PrimaryKey = New DataColumn() {dt.Columns(2)}

Q2つのDataTableをJoin

VB.NETで、
別々のDataTableを外部結合したいです。
どのようにすれば実現できますか?
AというDataTable
CD,
Name
BというDataTable
CD,
Amt
とします。
CDが同じもので結合し、(Aにあるものだけ)
CD,Name,AmtというViewを作成したいです。

お願いします。

Aベストアンサー

データセットの「Relation」プロパティを使用する

MSDN Online Home > Column This Week > 10 行でズバリ !!
http://www.microsoft.com/japan/msdn/thisweek/10lines/relationaldata_vb.asp

VB.NET> VB.NET 突撃レポート> 9
http://www.mitene.or.jp/~sugisita/net/vbnet_rep009.html

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QDataGridViewに複数テーブルのデータをセットしたい

VB6だったら複数テーブルを結合して取得したrecordsetを
表に1行ずつセットできましたが
VB2008で同じことをやりたい場合はどうすればよいのでしょうか?
1つのテーブルを検索してDataGridViewに接続させるやり方は
いろいろな本にあるのですが複数テーブルの場合がありません。
DataGridView上で編集できなくても行を選択して
別画面で編集するのでデータをDataGridViewに表示させるだけでOKです。
よろしくお願いします。

Aベストアンサー

どうもです。

古い記事によると
DataTableの結合は
コード上ではできないようですね。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=4412&forum=7

いつからかは知りませんが、
http://oshiete1.goo.ne.jp/qa1193685.html
データセットの「Relation」プロパティを使用することで同じような事ができそうです。
多分、DataSetにデータベースの主キーのようなものを設定して、結合しよう。的な考えだと思います。

>複数テーブルを結合したdatatableを作って
>bindするとDataGridViewに表示できますか?

については、コード上で
単一テーブルの結果をDataGridViewに表示できているなら
全く同じ考え方でできますよ。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

Qデータセットのレコード更新がしたい

VB .Netでデータベースの追加・変更をしています。
データセットのレコードを追加できたのですが、変更がわかりません。
追加は・・・dtrow = dttable.NewRowで始まり、追加したい項目を書いています。
そして終わりは・・・
''行を追加
dttable.Rows.Add(dtrow)
''データソースを更新
oleDa.Update(dttable)

変更はどうしたらよいのでしょうか?

Aベストアンサー

>データセットのレコード更新がしたい

データセット?データセットにはレコードはありません
データテーブルにレコードがあります
こんな感じ
Dataset
└─DataTable
  └─DataRowCollection

新規追加ができているなら更新は簡単です

まず更新したいレコードを検索する
検索できたら、そのレコードをDataRowにて取得する

その後、対象フィールドを上書きしてからDataTableのUpdateメソッドにて更新する

[例]
Dim dRow As DataRow

'主キーにて検索(※123は検索項目値)
dRow = dTbl.Rows.Find(New Object() {123})

If Not dRow Is Nothing Then

  'フィールド更新
  dRow.Item("hogehoge") = "ほげほげ"

  dTbl.Update()

End If

QDataTableに特定のフィールドが存在するかどうか調べるには?

DataTableに登録されているフィールドに、特定のフィールドが存在しているかどうか調べるには、どのようにすればよいでしょうか?

dtTable.Columns.Add("TEST1")
dtTable.Columns.Add("TEST2")

dtTableにTEST1とTEST2のフィールドが登録されていたとして、

Dim tmp As String = dtTable.Rows(0).Item("TEST3"),ToString

TEST3のフィールド名で値を取得しようとすると、TEST3の列が登録されていない為、エラーとなります。

そこで、事前にTEST3というフィールドが、DataTableに存在するかどうか調べたいのです。
(ハッシュテーブルのContainsKeyメソッド等のようなものを求めています)
お分かりになる方がいましたら、宜しくお願いします。

Aベストアンサー

DataColumnCollection.Contains メソッド
http://msdn2.microsoft.com/ja-jp/library/system.data.datacolumncollection.contains(VS.80).aspx
を使用すればよいと思います。

ちなみに、DataTable.Columns が DatacolumnCollection クラスです。

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング