1

傾向を SQL テーブルに保存できるプログラムを作成しようとしています。テキスト ボックスに入力されたハッシュタグがまだ存在しない場合はデータベースに追加し、カウンターを 1 増やします。

最初の列は "HashTag" で、2 番目の列は "Counter" で、それぞれ char(10) と int プロパティがあります。

私はSQLが初めてなので、少し問題があります。これは私がこれまでに持っているものです。

SqlConnection connection = new SqlConnection();
connection.ConnectionString = (@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Jordan Moffat\Desktop\coursework\WindowsFormsApplication\WindowsFormsApplication\HashTags.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
connection.Open();
HashTagReader r = new HashTagReader();
if (r.HashTagSearch(s))
    MessageBox.Show("I Found it!");
else
{
    SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag, Counter) " + "Values (s, ++)", connection);
    myCommand.ExecuteNonQuery();
}
connection.Close();

助言がありますか?

4

4 に答える 4

1

SQL 2008以降を使用している場合は、マージステートメントにアクセスできます。そのようなもの:

CREATE TABLE #tmp
    (
      [HashTag] VARCHAR(10) NOT NULL ,
      [Counter] INT NOT NULL
    );

MERGE [#tmp] AS t
    USING 
        (
          SELECT    [HashTag] ,
                    [Counter]
          FROM      ( VALUES ( '#kitties', 3) ) AS f ( [HashTag], [Counter] )
        ) AS s
    ON t.[HashTag] = s.[HashTag]
    WHEN NOT MATCHED BY TARGET 
        THEN
    INSERT  ( [HashTag], [Counter] )
          VALUES
            ( s.[HashTag] ,
              s.[Counter]
            )
    WHEN MATCHED 
        THEN
    UPDATE
          SET
            t.[Counter] += s.[Counter]
    OUTPUT
        $ACTION ,
        INSERTED.* ,
        DELETED.*;

ここでは、出力句を使用して、それが何をしているのかを示しています。マージステートメントを複数回実行し、出力がどのように変化するかを確認します。気が狂ったように感じる場合は、これを2つのパラメーター(ハッシュタグとカウンター)を受け取るストアドプロシージャでラップすると、すばらしいものが得られます。楽しみ!

于 2012-05-02T16:45:52.523 に答える
1

Counter列をIdentity(1,1)に変更すると、自動的にインクリメントされます。これは、SQLManagementStudioを介して簡単に実行できます。

次に、クエリを次のように変更します。

SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag) Values ('" + s + '")", connection); 

注:SqlCommandは、IDisposableを実装するDbCommandを継承していると思います。管理されていないリソースをクリーンアップするには、次のように、これらのオブジェクトをusing()ステートメントでラップする必要があります。

using(SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag) Values ('" + s + '")", connection))
{
  ...
}
于 2012-05-02T03:00:10.253 に答える
0

You can use Parameters to avoid sql injection :

   string hashtag = "Your HashTagValue";
   string counter = "Your Counter Value";

   SqlCommand myCommand = new SqlCommand("INSERT INTO tblHashTag (HashTag, Counter) Values (@HashTag,@Counter)", connection);
   myCommand.Parameters.Add("@HashTag", SqlDbType.varchar,50).Value = hashtag;  //Your hashTagvalue
   myCommand.Parameters.Add("@Counter", SqlDbType.varchar,50).Value = counter; //Your Counter Value

   myCommand.ExecuteNonQuery();
于 2012-05-02T03:13:51.140 に答える
0

Chrisの回答に追加するには、挿入の重複を避けるために(SQL Server 2005以降を使用している場合)HashTag列に一意のインデックスを追加して制限を適用する必要があります。

次に、コードでWHERENOTEXISTS句を使用する必要があります。ここを参照してください:存在しない場合のSQLServer挿入のベストプラクティス

したがって、次のようになります。

"INSERT INTO tblHashTag (HashTag)
             Values ('" + s + "')
 WHERE NOT EXISTS (SELECT HashTag 
                   FROM tblHashTag
                   WHERE HashTag = '" + s + '")"
于 2012-05-02T03:03:10.210 に答える