2017-06-28 23 views
1

訪問数を記録する1つの列テーブルがあります。 Global.asax.csでは、application_start内でこの値を1ずつ増やそうとしましたが、フィールドは更新されません。例外はありませんが、影響を受ける行の数は常にゼロです。MS SQLテーブルを更新できません

SSMSで同じ簡単なクエリを試しましたが、同じことが起こりました。0行が影響を受けました。 NumVisitsという1つのint列があります。

Application.Lock(); 
int iNumVisits = SomeClass.GetNumVisits(); 
SomeClass.UpdateNumVists(iNumVisits + 1); 
Application.UnLock(); 

これは工assである(BLL): これはGlobal.asax.csでのApplication_Startの一部である

public static void UpdateNumVists(int iNumVisists) 
{ 
    LocaleRepository oLocaleRepository = new LocaleRepository(new SqlDbContext()); 
    oLocaleRepository.UpdateNumVists(iNumVisists); 
} 

これはDALである:

public void UpdateNumVists(int iNumVisits) 
{ 
    int iRet = 0; 
    try 
    { 
     dbContext.Open(); 
     List<SqlParameter> spParams = new List<SqlParameter>(); 
     string sQuery = "update Visits set NumVisits = @NumVisits"; 
     spParams.Add(dbContext.CreateSqlParam("@NumVisits", SqlDbType.Int, 0, iNumVisits)); 
     dbContext.ExecuteSqlNonQuery(sQuery, spParams, ref iRet); 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 
    finally 
    { 
     dbContext.Close(); 
    } 
    return; 
} 

私が使用しますexecuteNonQueryを使用するすべてのコマンドで次のようになります。

public void ExecuteSqlNonQuery(string sQuery, List<SqlParameter> spParams, ref int iRet) 
{ 
    using (SqlCommand command = new SqlCommand()) 
    { 
     command.CommandType = CommandType.Text; 
     command.Parameters.AddRange(spParams.ToArray<SqlParameter>()); 
     command.Connection = DbConnection; 
     command.CommandText = sQuery; 
     try 
     { 
      iRet = command.ExecuteNonQuery(); 
     } 
     catch(Exception e) 
     { } 
    } 
} 

更新コマンドを実行すると、iRetはゼロになります。なぜ単純な更新クエリが機能しないのかわかりません。

これは私がSSMSからもらっ作成するスクリプトです:テーブル内のデータが存在しないように思え

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Visits](
    [NumVisits] [int] NULL 
) ON [PRIMARY] 

GO 
+0

テーブルにデータがありますか? –

+0

最初は、いいえ。フィールドはnullです。選択されたメソッドはゼロを返します。更新は更新されません。私はそれが違いをもたらすかどうかをゼロに初期化します。 – NoBullMan

+0

コメントを返信に変更できますか?ヌル値をゼロに変更すると問題が解決しました。私は答えとしてマークします。 – NoBullMan

答えて

1

、すべてのレコードがVisitsにあるのですか?

+0

私は同意します。このような場合は、@AndrewDiamondに彼が最初に書き留めたクレジットを与えてから、私の答えに追加してください。 – HLGEM

1

一般的に、更新が行われない理由はいくつか考えられます。

フィールドがIDフィールドまたは計算フィールドでもある場合、通常の更新は機能しません。これはあなたのケースには見えませんが、将来を知ることは良いことです。

次の表にトリガーがあると、更新を妨げる可能性があります。 SSMSは、テーブルのスクリプト作成時に必ずしもスクリプトをトリガーするわけではないため、トリガーがあるかどうかはわかりません。

第3に、最も一般的なことは、アプリケーションが予想通りに更新ステートメントを送信していない可能性があります。これは、ヌルの問題がある場合にしばしば真です。変数が正しく入力されていない場合は、実際にはnull値をnull値に更新している可能性があります。プロファイラを実行して、アップデートを実行しようとしたときに送信されている内容を正確に取得します。実際に実行されているステートメントが表示されると、その問題が表示されます。場合によってはスペースが足りないことがあります。また、読み込まれていない変数もあります。

コードを実行しているユーザーには、テーブルの更新権限がありません。この場合、メッセージを受け取ったはずです。

Profilerを実行している場合は、SSMSでその正確なコードを実行し、更新があるかどうかを確認してください。時には、あなたがそれをするときに、より良いエラーバブルを得ることがあります。特に、アプリケーションコードのエラー処理がうまく設計されていない場合

もちろん、テーブルにデータがない場合は、更新を挿入する必要はありません。または、更新するレコードが見つからない可能性があります。同じ条件を使用して選択を試みてください。更新するレコードがない場合があります。

関連する問題