VB2005 SQL INSERTについて

このQ&Aのポイント
  • VB2005 Express Editionを使用しています。レコードの追加がうまくいかず困っています。解決策を教えてください。
  • VB2005のSQL INSERT文を使用してデータベースにレコードを追加しようとしていますが、エラーが発生して追加できません。どこに問題があるのか教えてください。
  • VB2005 Express EditionでのSQL INSERT文についての疑問です。レコードの追加方法が分からず困っています。解決策を教えてください。
回答を見る
  • ベストアンサー

VB2005 SQL INSERTについて

VB2005 Express Editionを使用しています。レコードの追加を以下のように行っておりますが、追加されません。プログラミングの世界に入ったばかりでどこが違うのか全く分かりません。ご教授ください。また、参考になるサイトがあれば教えてください。 Dim Cn As New SqlConnection Cn.ConnectionString = "Data Source=.\SQLEXPRESS;AttachDbFilename" & "=|DataDirectory|\Database1.mdf;Integrated Security=True;" & "User Instance=True" Dim cmd As New SqlCommand cmd.Connection = Cn cmd.CommandText = "INSERT INTO USER_ID (ユーザー名, パスワード) VALUES ('AAA', 'XXX')" Cn.Open() cmd.ExecuteNonQuery() Cn.Close()

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

>Database1.mdfとformが同じ階層にあります。 そうですか、しまった。ASP.NETではなくて、Windowsアプリだったですね。すみません。 Windowsアプリの場合、開発環境で実行すると、一旦モジュールがコンパイルされて、bin/Debugというフォルダに入ります。 そのときにデータベースのmdfファイルもそこにコピーされます。 |DataDirectory|で指定されるフォルダがbin/Debugになっているので、実際には更新は正常に行われていて、bin/Debugの下にあるコピーされた方のmdfファイルに更新がかかっている、ということですね。 (Windowsアプリ開発では基本だったかもしれませんが、私もあまりやらないので、気づきませんでした)。 とりあえず、bin/Debugのフォルダのmdfをチェックしてみてください。

ryoutaryou
質問者

お礼

jamshid6さん確認が遅れ申し訳ありません。 まだ、bin/Debugのフォルダのmdfの確認は行っていませんが、大変参考になりました。今回の事例はやっぱり基本的なことなのでしょうか?(開発を行う者にとっては当然のことなのでしょうか?) また、上記のような事はどのようにして学べばよいのでしょうか?仕事はサービス業を行っていますので、周囲に詳しい方もいないので相談が出来ない状況です。

その他の回答 (3)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.4

>今回の事例はやっぱり基本的なことなのでしょうか?(開発を行う者にとっては当然のことなのでしょうか?) おそらく、.NETでWindowsアプリを開発する人には基本的なことでしょうね。でも、焦ることはないと思います。私もアプリ開発は専門ではなくて、普段はASP.NET(Web)の方でしか書かないから最初気付かなかったわけですからね。 質問者さんがSQL Serverに投稿されましたので、たまたま私が拾いましたが、プログラミングカテゴリに投稿していれば一発で回答がついたかもしれません。今回の件も、データベースがエラーメッセージなしで更新もされないという事象はありえないという認識のもと、ExecuteNonQueryのところの変数をチェックして気づいたというのが正直なところです。使っていないとわからない、そんなものです。 >また、上記のような事はどのようにして学べばよいのでしょうか?仕事はサービス業を行っていますので、周囲に詳しい方もいないので相談が出来ない状況です。 本業でなく.NETで書かれているとすれば大したものだと思います。 .NETは深く理解しなくても動くものが作れてしまうので、結果的に基本的なことで見落としてしまうことがあるというだけです。 独学で作り始めたのであれば、一通り作れるようになったと思ったところで、データベースを使った基本的なプログラミング解説書を読んでみると、自分が見落としていることがかなり書かれていることに気付くはずです。あとはそういう本やWebに載っているサンプルコードをできるだけ見てみることをお勧めしておきます。王道はありません。頑張ってください。

ryoutaryou
質問者

お礼

jamshid6さん有難うございます。 >独学で作り始めたのであれば、一通り作れるようになったと思ったところで、データベースを使った基本的なプログラミング解説書を読んでみると、自分が見落としていることがかなり書かれていることに気付くはずです。あとはそういう本やWebに載っているサンプルコードをできるだけ見てみることをお勧めしておきます。王道はありません。頑張ってください。 やはり、たくさんのサンプルコードを見たりして、知識を深めていく事が大切なんですね。動作が正常に行われるという結果までは多くの記述方法があり、的確に判断しなくてはいけないということが分かりました。大変参考になりました、有難うございます。

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

ソースを見る限りはASP.NETですよね。 実際に試してみましたが、残念ながら何のエラーも返らず、INSERTもされないという状況を作ることができませんでした。 更新されなかった場合はいかなる場合でもエラーが返ります。 (読取専用でも、更新権限がなくても、トリガでロールバックしても、INSERT構文が不正でも) ・書かれたコード以外にエラーを抑え込むような記述(try-catchなど)はありませんよね? ・開発段階(ローカルでデバッグ、実行ができる状態)でもこの事象がおきますか? ・Database1.mdfは項目の追加で「SQLデータベース」を選んで、App_Dataの下に作ったんですよね? ・デバッグしても「cmd.ExecuteNonQuery()」は正常に通りますか?

ryoutaryou
質問者

お礼

jamshid6さん有難うございます。実際に試していただいて恐縮です。 >書かれたコード以外にエラーを抑え込むような記述(try-catchなど)はありませんよね?  他の記述はありません >開発段階(ローカルでデバッグ、実行ができる状態)でもこの事象がおきますか?  開発段階でも同様の事象が起きます。 >Database1.mdfは項目の追加で「SQLデータベース」を選んで、App_Dataの下に作ったんですよね?  Database1.mdfとformが同じ階層にあります。 >デバッグしても「cmd.ExecuteNonQuery()」は正常に通りますか?  やはり正常に通ります。 jamshid6さんに回答していただいて分かったことは、やはり基本的なことが良く分かっていないと感じました。設定を再度見直してみます。厚かましいとは思いますが、基本的なことを学ぶのに参考となるサイトを教えていただけますか?

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

通常は別の処理順序で書きますよとか、Using句を使った方がとか、USER_IDは予約語ですよとか、いろいろあるにはあるんですが、 とりあえず書かれたコードは動くはずです。 だから、ここに開示されていない理由が原因だと思うのですが。 レコードが追加されません、とありますが、実行してもエラーメッセージも何も返らないのですか?

ryoutaryou
質問者

お礼

jamshid6さんご回答いただき有難うございます。 >とりあえず書かれたコードは動くはずです。  それを聞いて少し安心しました。 >だから、ここに開示されていない理由が原因だと思うのですが。 >レコードが追加されません、とありますが、実行してもエラーメッセージも何も返らないのですか?  そうなんです、実行してもエラーが返ってこないのでなにが悪いのかわからない状態です。ちなみにSELECT文は実行できています。

関連するQ&A

  • C#のSQL言語について教えてください。

    windowsフォーム上にデータベースのテーブルを載せて、 書き込むボタンを作り、その書き込み内容を書き込み直後にフォーム上のデータベースのテーブルに反映させたいと思っているのですが反映されません。コードが間違っていますでしょうか? これがソースです。 SqlConnection cn; SqlCommand cmd; cn = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=E:\開発用\入退室記録システム(接続から読取)\SampleApplicationByCS\Database1.mdf; Integrated Security=True; Connect Timeout=30; User Instance=True"); cmd = new SqlCommand("Select * From Product", cn); cn.Open(); //Table1の学籍番号00000001の行の授業開始の列に1と入力する。 cmd = new SqlCommand("UPDATE Table1 " + "SET 授業開始='1' WHERE 学籍番号=" + response.Comm[ix].TagData, cn); cmd.ExecuteNonQuery(); SqlTransaction st; st = cn.BeginTransaction("Table1"); cmd.Transaction = st; st.Commit(); cn.Close(); コミットはこれでいいのでしょうか? this.table1TableAdapter.Fill(this.database1DataSet.Table1); これを入れてもテーブルが更新されませんでした。

  • Insertできません

    どうしてもInsertできませんどこが間違っているのか教えてください。 Dim cn As New SqlConnection("workstation id=""ユーザー名?"";packet size=4096;user id=test;data source=server名;per" & _ "sist security info=True;initial catalog=テーブル名;Password=パスワード") Dim cmd As New SqlCommand("カラム1", cn) cmd.CommandType = CommandType.StoredProcedure 'cnst.CommandText = "INSERT INTO テーブル名(カラム1, カラム2, カラム3,カラム4) " & _ '"VALUES (@カラム1, @カラム2, @カラム3,@カラム4())" Dim p1 As SqlParameter = cmd.Parameters.Add("@カラム1", SqlDbType.VarChar, 20) p1.Value = TextBox1.Text Dim p2 As SqlParameter = cmd.Parameters.Add("@カラム2", SqlDbType.VarChar, 20) p2.Value = TextBox2.Text Dim p3 As SqlParameter = cmd.Parameters.Add("@カラム3", SqlDbType.VarChar, 20) p3.Value = Dropdownlist1.DataTextField Dim p4 As SqlParameter = cmd.Parameters.Add("@カラム4", SqlDbType.VarChar, 20) p4.Value = TextBox3.Text cn.Open() cmd.ExecuteNonQuery() cn.Close() SqlDataAdapter2.Fill(DataSet21) DataGrid1.DataBind() End Sub __________________________________________ __________________________________________

  • sqlserverに現在時刻を格納したいのですが、『':'付近に不適切

    sqlserverに現在時刻を格納したいのですが、『':'付近に不適切な構文があります。』 と出てしまい、格納されません。言語はVC#2008、データ型はtime(7),datetimeなど試しているのですがうまくいかないのです。orz 以下、コードです。 SqlConnection cn = new SqlConnection(@"Data Source=.\SQLEXPRESS; AttachDbFilename=F:\C#\MyDatabase.mdf; Integrated Security=true; Connect Timeout=30; User Instance=true"); DateTime dt = DateTime.Now; TimeSpan ts = dt.TimeOfDay; // 更新 int id = int.Parse(textBox2.Text); SqlCommand cmd = new SqlCommand( "UPDATE Product SET 時刻 = " + ts + " WHERE ID ='" +id.ToString()+"'", cn); cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); 原因判りますでしょうか・・・ よろしくお願いします。

  • DB接続文字列の一般的プログラミング方法について

    DB接続プログラムで Dim connectionString As String Dim Cn As New SqlConnection Dim cmd As SqlCommand Dim ServerName As String = "(local)" 'サーバー名(またはIPアドレス) Dim UserID As String = "sa" 'ユーザーID Dim Password As String = "" 'パスワード Dim DatabaseName As String = "ogawaDB" 'データベース connectionString = "Server=" & ServerName & ";" connectionString &= "User ID=" & UserID & ";" connectionString &= "Password=" & Password & ";" connectionString &= "Initial Catalog=" & DatabaseName Cn.ConnectionString = connectionString cmd = Cn.CreateCommand cmd.CommandText = "SELECT id FROM table1" Cn.Open() Debug.Print(cmd.ExecuteScalar) Cn.Close() cmd.Dispose() Cn.Dispose() のデータベース接続プログラムで connectionStringにデータベース接続情報を書くと思うのですが これを各プログラム毎に記述していたのでは変更が生じた場合 管理が大変だと思うのですがこの記述情報をファイルから読みっとったり して対応するのでしょうか。 一般的の接続文字列の管理方法(プログラミング方法)を 教えてください

  • vb2005.netでCrystalReports

    クリスタルレポート初心者です。宜しくお願いします。 以下のソースでクリスタルレポートから印刷を行っていますが、最後にSQLSERVERのパスワード入力のダイアログが出てしまいます。 Dim cn As New SqlClient.SqlConnection Dim cmd As New SqlClient.SqlCommand Dim oDataAdapter As New SqlClient.SqlDataAdapter Dim oDataSet As DataSet = New DataSet Dim oCryRepo As HIJYUU = New HIJYUU cn.ConnectionString = "Server=192.168.1.1;Initial Catalog=TESTDB;ID=sa;Passworsd="pw001;" cn.Open() cmd.Connection = cn cmd.CommandText = "select * from h_tbl where ndate='" & "20110715" & "'" oDataAdapter.SelectCommand = cmd oDataSet.Clear() oDataAdapter.Fill(oDataSet, "H_TBL") oCryRepo.SetDataSource(oDataSet) crView.ReportSource = oCryRepo cn.Close() パスワード入力のダイアログを出さずに印刷する方法を教えていただきたいのですが。 その画面でパスワードを入力すれば正常に印刷されます。 環境はVB2005.NET、それにバンドルされているクリスタルレポート、sqlserver2008です。 以上、宜しくお願い致します。

  • エクセルからSQLの接続の仕方

    エクセルを使ってMSSQLに接続したいのですが、エラーがでて接続できません。 なぜでしょうか? [エラー内容] コンパイルエラー: ユーザー定義型は定義されれいません。 コードの下の部分で発生します。 Dim Cn As New System.Data.SqlClient.SqlConnection [コード] Private Sub CommandButton1_Click() Dim St As String Dim Cn As New System.Data.SqlClient.SqlConnection Dim SQL As System.Data.SqlClient.SqlCommand Dim ServerName As String Dim UserID As String Dim Password As String Dim DatabaseName As String ServerName = "TEST-PC" 'サーバー名(またはIPアドレス) UserID = "sa" 'ユーザーID Password = "password" 'パスワード DatabaseName = "TEST_DB_20140801" 'データベース St = "Server=" & ServerName & ";" & "User ID=" & UserID & ";" & "Password=" & Password & ";" & "Initial Catalog=" & DatabaseName Cn.ConnectionString = St SQL = Cn.CreateCommand SQL.CommandText = "SELECT * FROM LOG_DATA_XLINE" Cn.Open MsgBox (SQL.ExecuteScalar) Cn.Close SQL.Dispose Cn.Dispose End Sub

  • ASP.NET C# SQLパラメータ

    いつもお世話になっております。 グリッドビューから編集、更新キャンセルの機能を使っているところなのですが、更新ボタンのイベント(RowUpdating)からだとUpdateCommandに直接SQL文を入れないとうまく行きません。 UpdateCommand = "update .....";のようにです。 SqlConnection cn = new SqlConnection(接続文字列); SqlCommand cmd = new SqlCommand(SQL文, cn); SqlParameter sp1 = cmd.Parameters.Add("@パラメータ", SqlDbType.Int); SqlParameter sp2 = cmd.Parameters.Add("@パラメータ2", SqlDbType.VarChar); sp1.Value = 変数 sp2.Value = 変数 cn.Open(); cmd.ExecuteNonQuery(); cn.Close(); のようにパラメータを使いたいのですが、UpdateCommandに対するパラメータの設定のやり方がわかりません、教えてください!!

  • プロシージャまたは関数の引数が多すぎますのエラー

    お世話になります。 下記のコードを実行すると プロシージャまたは関数 spTest の引数が多すぎます どこが悪いのかご教示お願いいたします。 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim conn As New SqlConnection(connstr) Dim cmd As New SqlCommand conn.Open() cmd.Connection = conn cmd.CommandText = "Delete Table2" cmd.CommandType = CommandType.Text Debug.WriteLine(cmd.ExecuteNonQuery()) For i = 1 To 100 spTest(cmd, i) Next conn.Close() End Sub sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer) Dim param As SqlParameter With cmd .CommandType = CommandType.StoredProcedure .CommandText = "spTest" param = .Parameters.Add(New _ SqlParameter("@ID", SqlDbType.Int)) param.Value = intID .ExecuteNonQuery()    ''''' ここで2回目からエラーが発生します End With End sub

  • SQLServer2008のDate型について

    SQLServer2008のDate型についてお聞きします Date型には日付のみセットされると思うのですが VB2010から接続表示すると時刻データまで表示されてしまいます テーブルデータの表示では「20120305」 VBでは「20120305 0:00:00」 となっております。 期待する動作はVBで「20120305」と表示されることです 接続はこの様にしております。 Dim cn As New SqlConnection(ConnectionString~) Dim cmd As New SqlCommand("SELECT * FROM Test1", cn) cn.Open() Dim dr As SqlDataReader = cmd.ExecuteReader While dr.Read() Trace.WriteLine(dr("Date").ToString) End While なぜ時刻までセットされてしまうのか理解できません。 ご指導よろしくお願い致します。

  • C# sqlserver 2005 vs2005 DB追加時重複ID禁止(2)

    こんにちは。標記の件で再度調べています。 ユーザ管理画面編集時に重複したID列を追加禁止としたいのですが、 datasetを使って、回すと件数が多くなったときに時間がかかって しまうので、SQLCOMMANDを使用使用と思っております。 SQLCOMMANDにはどのような指定を行ったらよいですか。 そこで、処理できますでしょうか? お願いします。 string userid = textBox1.Text;、 string StrConn = @" "; SqlConnection cnc = new SqlConnection(StrConn); cnc.Open(); SqlCommand cmd = new SqlCommand("●", cnc); cmd.ExecuteNonQuery(); cnc.Close();