今、SQLserverを使ってデータベースを変更、追加をしようとしているんですが、アダプターを使わないという、制限があります。
下のコマンドの記述では、下のほうの[CreateDataSet()]で、とまってしまいます。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
このエラーがでてくるんですが、どこがおかしいかわかりますか?
Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
CreateDataSet()
scd.CommandText = "select No ,社員ID ,名前 ,ふりがな" & "from [社員ID]"
sda.SelectCommand = scd
sql.Open()
sda.Fill(ds, "社員ID")
sql.Close()
Dim myRow As System.Data.DataRow
Dim myTable As New System.Data.DataTable
myTable.Clear()
myTable = ds.Tables("社員ID")
myRow = myTable.NewRow()
myRow("社員ID") = txtID.Text
myRow("名前") = txtName.Text
myRow("ふりがな") = txtKana.Text
myTable.Rows.Add(myRow)
Dim myCommand As New SqlClient.SqlCommandBuilder(sda)
sda.InsertCommand = myCommand.GetInsertCommand
CreateDataSet()
sql.Open()
sda.Update(ds, "社員ID")
ds.Clear()
sql.Close()
End Sub
>アダプターを使わずに、データベースにデータを追加するには?
sda って SqlDataAdapter オブジェクトじゃないの?
CreateDataSet() などというメソッドは存在しません。
ユーザ定義の関数でしょ?中で何が起こってるか想像しろとでも?
>どこがおかしいかわかりますか?
質問の内容がおかしいです。
また、サンプルソースを載せるときは全ての変数の定義を
明らかにするようにして下さい。上のコードでは関数の外で
宣言された変数が全く説明されていません。
説明不足ですいません。
アダプター使うんですけど、.netのwindowsフォームを使わずに、自分でコードをうちこんで作るってことです。
createdataset()の中身ですが、
Private Sub CreateDataSet()
sql = New SqlClient.SqlConnection("workstation id=SATAKEN95;" & _
"user id=sa;" & _
"password=sataken;" & _
"data source=SATA-XP2;" & _
"persist security info=False;" & _
"initial catalog=test;")
scd.Connection = sql
End Sub
上記になっています。
説明不足で本当にすいませんでした。
止まった時点で scd をクイックウォッチすると何が表示されますか?
Nothing だったらそれが原因です。
確かに、Nothingになってます。
この場合、どのあたりをなおしたらいいんでしょうか?
オブジェクト参照がオブジェクト インスタンスに設定されていません。
こんなエラーもでていました。
どのあたりというか…全てを丸ごと直したいです、ボクは。
まず関数 CreateDataSet ですが、ちっとも DataSet を
作ってません。誤解を招く名前を付けるのはやめましょう。
また、この内容のみなら2回目を実行する意味がありません。
2回目の呼び出しを削除して下さい。
データアダプタは、データベースに接続し、テーブルから
レコードを取得し、データセット内にレコードの値をセットし、
接続を閉じる。という機能を持ってます。
sql.Open()
sql.Close()
は必要ありません。削除して下さい。
[参考]
http://www.atmarkit.co.jp/fdotnet/basics/adonet04/adonet04_01.html
scd.CommandText = "select No ,社員ID ,名前 ,ふりがな" & "from [社員ID]"
ですが、このまま文字連結すると『ふりがなfrom』と繋がるので
エラーになります。スペースを入れて下さい。
>確かに、Nothingになってます。
>この場合、どのあたりをなおしたらいいんでしょうか?
>オブジェクト参照がオブジェクト インスタンスに設定されていません。
>こんなエラーもでていました。
同じ内容です。インスタンスが生成されていません。
意味が分からないならここの過去ログ検索『インスタンス』か
ヘルプにも載ってますが?調べないんですか??必要な場所で
New するか参照を設定して下さい。どこが適切か?は
Private sda As SqlClient.SqlDataAdapter()
Private scd As SqlClient.SqlCommand
Private sql As SqlClient.SqlConnection
Private ds As DataSet()
が関数の外部で宣言されており、普通、こういった形にするのは
他の関数でも利用したりする場合のため、soushi さんでないと判断
できないはずです。ボクに聞かれても答えられません。他で利用して
無いなら関数内のローカル変数で十分でしょう。その場合は変数宣言
付近で生成すればいいんじゃないでしょうか?。
scd.Connection = sql
この部分でエラーがでてるみたいです。
CreateDataSet()
scd.CommandText = "SELECT 社員ID ,名前 ,ふりがな ,性別 ,生年月日 ,所属ID ,役職ID ,血液型 ,電子メール ,郵便番号 ,住所 ,自宅電話番号 ,携帯電話番号 ,携帯短縮番号 ,内線番号 ,入社年月日 " & " [社員IDマスター]"
'sda.SelectCommand = scd
'sda.Fill(ds, "社員IDマスター")
Dim myRow As System.Data.DataRow
Dim myTable As New System.Data.DataTable
myTable.Clear()
myTable = ds.Tables("社員IDマスター")
myRow = myTable.NewRow()
myRow("社員ID") = txtID.Text
myRow("名前") = txtName.Text
myRow("ふりがな") = txtKana.Text
myRow("性別") = txtSex.Text
myRow("生年月日") = txtBirthDay.Text
myRow("所属ID") = txtSyozoku.Text
myRow("役職ID") = txtYakusyoku.Text
myRow("血液型") = txtBlood.Text
myRow("電子メール") = txtEmail.Text
myRow("郵便番号") = txtPost.Text
myRow("住所") = txtAddress.Text
myRow("自宅電話番号") = txtTel.Text
myRow("携帯電話番号") = txtKeitai.Text
myRow("携帯短縮番号") = txtTansyuku.Text
myRow("内線番号") = txtNaisen.Text
myRow("入社年月日") = txtNyuusya.Text
myTable.Rows.Add(myRow)
Dim myCommand As New SqlClient.SqlCommandBuilder(sda)
sda.InsertCommand = myCommand.GetInsertCommand
sda.Update(ds, "社員IDマスター")
ds.Clear()
とりあえず、これでできたんですが、生年月日をdate型で書き込みたいんです。
形としては、yyyy/mm/dd です。
いい方法ないですか?
cdateで解決しました!!
ありがとうございました!!
また、質問することがあるかとおもいますが、よろしくおねがいします。
ツイート | ![]() |