アダプターを使わずに、データベースにデータを追加するには?

解決


soushi  2004-12-10 20:38:25  No: 118161

今、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


特攻隊長まるるう  2004-12-10 21:56:47  No: 118162

>アダプターを使わずに、データベースにデータを追加するには?
sda って SqlDataAdapter オブジェクトじゃないの?

CreateDataSet() などというメソッドは存在しません。
ユーザ定義の関数でしょ?中で何が起こってるか想像しろとでも?

>どこがおかしいかわかりますか?
質問の内容がおかしいです。

また、サンプルソースを載せるときは全ての変数の定義を
明らかにするようにして下さい。上のコードでは関数の外で
宣言された変数が全く説明されていません。


soushi  2004-12-10 22:06:09  No: 118163

説明不足ですいません。
アダプター使うんですけど、.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

上記になっています。
説明不足で本当にすいませんでした。


特攻隊長まるるう  2004-12-10 22:44:40  No: 118164

止まった時点で scd をクイックウォッチすると何が表示されますか?
Nothing だったらそれが原因です。


soushi  2004-12-10 22:47:33  No: 118165

確かに、Nothingになってます。
この場合、どのあたりをなおしたらいいんでしょうか?


soushi  2004-12-10 22:49:40  No: 118166

オブジェクト参照がオブジェクト インスタンスに設定されていません。
こんなエラーもでていました。


特攻隊長まるるう  2004-12-10 23:35:02  No: 118167

どのあたりというか…全てを丸ごと直したいです、ボクは。

まず関数 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 さんでないと判断
できないはずです。ボクに聞かれても答えられません。他で利用して
無いなら関数内のローカル変数で十分でしょう。その場合は変数宣言
付近で生成すればいいんじゃないでしょうか?。


soushi  2004-12-10 23:43:54  No: 118168

scd.Connection = sql
この部分でエラーがでてるみたいです。


soushi  2004-12-11 00:09:34  No: 118169

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  です。
いい方法ないですか?


soushi  2004-12-11 00:33:51  No: 118170

cdateで解決しました!!
ありがとうございました!!
また、質問することがあるかとおもいますが、よろしくおねがいします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加