-1

Setup次のテーブルで呼び出される作業データベースがあります。

tblPeople
-----------------
people  nchar(50)
occur   int

ユーザーが入力したデータ (人) をテキスト ボックスから読み込むための Windows フォーム アプリを持っていますが、(人) データがすべて入力されている場合は、追加するのではなく、設定する方法がわかりません。再びデータベースに入れ、発生列にカウントしたい。たとえば、Fred が 2 回入力された場合、それが表示されます。

people occur
------ -----
Fred     2

コード:

SqlConnection connection = new SqlConnection();
connection.ConnectionString = (@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\John\Desktop\database practise\db1\db1\Setup.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand command = new SqlCommand();
command.Connection = connection;

connection.Open();
command.CommandText = "INSERT INTO tblPeople  (people) VALUES (@people)";

try
{
    string[] splittext = textbox1.Text.Split(' '); 
    foreach (string ppl in splittext)
    {
        if (ppl.StartsWith("*")) 
        {
            command.Parameters.AddWithValue("@people", ppl);
            int rowsAffected = command.ExecuteNonQuery();
            MessageBox.Show("Inserted: " + rowsAffected.ToString());
        }
    }
}
finally
{
    connection.Close();
}

文字列分割ビットを無視します。これはすべて正常に機能します。方法がわからない発生列のカウンターを追加するだけです。

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

1

挿入する前に、その名前のレコードが既に挿入されているかどうかを確認する必要があります。挿入されている場合は、単純にカウントを更新します。そうでない場合は、新しいレコードを挿入します。これをストアドプロシージャに変換します

CREATE PROCEDURE SavePeople(@peopleName varchar(50))
AS
 BEGIN
   IF EXISTS(SELECT PEOPLE FROM tbl_PEOPLE WHERE PEOPLE=@peopleName)
    BEGIN
      UPDATE tbl_People Set Occur=OCcur+1 WHERE PEOPLE=@peopleName
    END
   ELSE
    BEGIN
      INSERT INTO (PEOPLE,OCCUR) VALUES (@peopleNAme,1)
    END

 END

コードを using ステートメントでラップします。save メソッドからループ ステートメントを取り出し、それをより一般的なメソッドに変換して、単一の人物名を受け入れて db に保存します。これを任意のシナリオから呼び出すことができるように (ループで 1 回または n 回)

string con=@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\John\Desktop\database practise\db1\db1\Setup.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"

public bool SavePeople(string peopleName)
{
   try
   {
      using (SqlConnection objConnection = new SqlConnection(con))
      {
        SqlCommand objCommand = new SqlCommand("SavePeople", objConnection);
        objCommand.CommandType = CommandType.StoredProcedure;
        objCommand.Parameters.AddWithValue("@peopleName", peopleName);       
        objConnection.Open();
        objCommand.ExecuteNonQuery();       
      }
      return true;
   }
   catch(Exception ex)
   {
      //You want to log the ex
   }
   return false; 
}
于 2012-04-28T15:47:08.473 に答える
0

コードで db`s フィールドを更新する方法は次のとおりです。

        using (SqlConnection conn = new SqlConnection("connString"))
        {
            int counter = 0;
            using (SqlCommand cmd = new SqlCommand("SELECT people FROM tblPeople", conn))
            {
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    if (reader.GetValue(0) != DBNull.Value)
                    {
                        counter = (int)reader[0];
                    }
                }
            }
            using (SqlCommand cmd = new SqlCommand("UPDATE tblPeople SET people = @myCounter", conn))
            {
                cmd.Parameters.Add("@myCounter", System.Data.SqlDbType.Int).Value = ++counter;
                cmd.ExecuteNonQuery();
            }
        }

1 つ目: 現在の値を読み取る (存在する場合) 2 つ目は、値を 1 つ増やしてフィールドを更新する

それが役に立てば幸い。さよなら

于 2012-04-28T16:36:03.543 に答える
0

がある。Linq に精通している場合は、このチェックを非常に簡単に行うことができます。すでに知っているコードを使って、いくつかのショートカットを作成しています。

string checkname = "Fred";
var x = tblPeople.Where(w => w.people == checkname);
if (x.Count > 0) 
{
  x.occur++;
  [databaseconnectionstring].SubmitChanges();
}
else 
{
  [insert your new record here]
}
于 2012-04-28T16:03:03.057 に答える
0

まず、(SELECT クエリを使用して) 現在の値を読み取る必要があります。次に、データベースのフィールドを更新する UPDATE SQL ステートメントを作成します。毎回 1 ずつ増やします。

于 2012-04-28T16:04:06.113 に答える