- PR -

SQLに挿入処理

投稿者投稿内容
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-13 16:16
いつもお世話になります。

やりたいことは、すでにあるデータに来月分の日付を追加して一覧表示して
必要な項目を GridView で修正し書き込む。
といったことやりたく、まづ日付を今あるデータに追加しようとカキをしようとしましたが、できません。

「SqlDataSource でGrivView に日付を左側1列目に1日から最後まで縦に1行ずつ表示し後でその他のカラムを修正なり行いたいのですが、うまくいきません。」

SqlDataSource1.InsertCommand = "INSERT INTO Holidays(Date) VALUES(@Date)";
データを挿入したい = current.Date.Year.ToString() + '/' + current.Date.Month.ToString() + '/' + current.Date.Day.ToString();
SqlDataSource1.Insert();

データが挿入できないので、NULL が挿入できません。許可されていません。
となります。

私は、今あるデータに日付を書き込みそれ以外の部分はヌルでいったん挿入し完了後にGridView で更新などの処理をしようと考えました。

質問は、こういった手法は順当な方法でしょうか?また順当なら挿入の方法など教えてください。または、C#で直接SQLを操作しているページなどご存知でしたら教えてください。
お願いします。

C# ASP.NET VS2005
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-05-13 23:33
GridViewが表示されるときには、既にデータベースに[日付以外が空]のデータが
入っていてほしいという事ですか?

引用:
または、C#で直接SQLを操作しているページなどご存知でしたら教えてください。

それはこのあたりが参考になるかと。
http://www.atmarkit.co.jp/fdotnet/basics/adonet03/adonet03_02.html

引用:
「SqlDataSource でGrivView に日付を左側1列目に1日から最後まで縦に1行ずつ表示し後でその他のカラムを修正なり行いたいのですが、うまくいきません。」

SqlDataSource1.InsertCommand = "INSERT INTO Holidays(Date) VALUES(@Date)";
データを挿入したい = current.Date.Year.ToString() + '/' + current.Date.Month.ToString() + '/' + current.Date.Day.ToString();
SqlDataSource1.Insert();

データが挿入できないので、NULL が挿入できません。許可されていません。
となります。

@Dateは何を元にしていますか?
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-14 09:04
お世話になります。

引用 ---------------------------------------------------------------------
GridViewが表示されるときには、既にデータベースに[日付以外が空]のデータが
入っていてほしいという事ですか?
------------------------------------------------------------------------

データ構成が日付、データ1、データ2、データ3となっているとき、GridView での表示は、日付が入っていてあとのデータ1,2,3は、空の状態を望んでます。

つまり、ボタンを押すか、そのページに来た時データベースのデータを検索しその最後の月の翌月分を日付とからデータで一覧表示したい。(データベース内のデータは、1月単位で新規作成・修正など行いたい)

そこで、教えていただいたページを参考にして下記のように書いてみました。

string connStr = "Server=(local)\\SL4;" + "Trusted_Connection=yes;" + "database=pubs";

for (int i = 0; i < 31; ++i)
{
string stDate;

stDate = string.Format("{0}/{1}/{2}", current.Date.Year.ToString(), current.Date.Month.ToString(), current.Date.Day.ToString());
string sqlStr = "INSERT INTO Holidays(Date, IsOff, WorkStartTime1, WordEndTime1, WorkStartTime2, WordEndTime2, WorkStartTime3, WordEndTime3) "
+ " VALUES (stDate, ' ', ' ', ' ', ' ', ' ', ' ', ' ')";

//sqlStr = String.Format(sqlStr, args[0], args[1]);

SqlConnection conn = new SqlConnection(connStr);
SqlCommand cmd = new SqlCommand(sqlStr, conn);

conn.Open();

int num = cmd.ExecuteNonQuery();
Console.WriteLine(num);

conn.Close();
}

これを試してみると、下記のようなエラーになりました。
「サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: SQL ネットワーク インターフェイス, error: 26 - 指定されたサーバーまたはインスタンスの位置を特定しているときにエラーが発生しました) 」

このエラーの意味するところを知りたいのですが、私が思うに、接続先が無いか見えないか、ぐらい?
また、上記コードで分からない個所があります。教えてください。
1.connStr にセットしている最初の Saver= は、自分のパソコンのネットワーク上の名前にしました。これで正しいですか?また、サーバーにセットするときそのサーバー名に変更してやらなければなりませんか?
2.SqlConnection, SqlCommand, Open(); をループ内でまわしています。これをループ外において、書き込み(ExecuteNonQuery();)のみループにできないのでしょうか?
いちいちセット、オープンは、負荷が多そうな気がしています。

教えてください。 C#、ASP.NET VS2005

まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2008-05-14 09:56
エラーは、接続文字列が間違っているからです。

引用:

1.connStr にセットしている最初の Saver= は、自分のパソコンのネットワーク上の名前にしました。これで正しいですか?また、サーバーにセットするときそのサーバー名に変更してやらなければなりませんか?


connStr には SQLServer に対する接続文字列をセットします。SqlDataSource1 のConnectionString プロパティの値と同じものをセットすれば良いです。

引用:

2.SqlConnection, SqlCommand, Open(); をループ内でまわしています。これをループ外において、書き込み(ExecuteNonQuery();)のみループにできないのでしょうか?
いちいちセット、オープンは、負荷が多そうな気がしています。


SqlConnection, Open, Close をループの外に出せば良いのではないでしょうか。
そもそも、そのようにロジックを組んだのはあなたです。
SqlCommand の作成については、(現時点では SQL をベタ書きしている以上)ループ内で行うしかないでしょう。パラメタライズドクエリーを利用すればこの点も含めて解決できます。べるさんが提示してくださった記事を「全て」読んでみてください。
SL
大ベテラン
会議室デビュー日: 2008/05/02
投稿数: 183
投稿日時: 2008-05-14 16:31
お世話になります。

先ほどのコードを下記のように書き換えましたが、接続がまだうまくいきません。
「このログインで要求されたデータベース "Schedule.mdf" を開けません。ログインに失敗しました。」
というメッセージが、Open() 実行時に出ます。最後の、darabase= をコメントにして実行するとOpen() は通るのですが次でコケます。

string connStr = "Server=(local)\\SQLEXPRESS;" + "Trusted_Connection=yes;" +"database=Schedule.mdf;";

conn.Open();
int num = cmd.ExecuteNonQuery();

データベース名のパスが通ってないようですが指定の仕方を教えてください
お願いします。


rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-14 17:01
データベースファイル名で指定する場合は、Database 属性ではなく、AttachDBFilename 属性を使います。
ここにいろいろ例があります。

また、VS2005以降ではこんな便利クラスもあります。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-05-15 09:05
http://connectionstrings.com/?carrier=sqlserver2005
で、SQL Server 2005の接続文字列の例を見ることが出来ます。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2008-05-15 09:24
そもそも、SqlDataSource1 で DB と接続できてますか?
できてるんだったら、

string connStr = SqlDataSource1.ConnectionString;

でとりあえずの接続確認はできる筈ですが。

スキルアップ/キャリアアップ(JOB@IT)