2012-07-31 20 views
2

我試圖從.net執行SQL Server存儲過程。我發現了錯誤如何查找哪個sql server參數在.net中拋出異常?

誤差變換數據類型數值爲十進制

但我有很難確定哪些SQL參數是罪魁禍首。

有70個,所以我敢肯定有一個比手動搜索更簡單的方法。

在「查看詳細信息」中,是否在異常框中的某處?在此先感謝..

相關的代碼(希望這是有益的......我並沒有包括所有的參數,但是這是模式):

public void WriteKeyStatToDB(KeyStatisticsDataCollection.KeyStatsDP dp) 
{ 
    SqlParameter symbol = SqlParameterFactory("@symbol", SqlParamInOrOut.Input, SqlDbType.Char); 
    SqlParameter dateAdded = SqlParameterFactory("@dateAdded", SqlParamInOrOut.Input, SqlDbType.Date); 
    SqlParameter tradeDate = SqlParameterFactory("@tradeDate", SqlParamInOrOut.Input, SqlDbType.Date); 
    SqlParameter marketCapIntra = SqlParameterFactory("@marketCapIntra", SqlParamInOrOut.Input, SqlDbType.Money); 
    SqlParameter entVal = SqlParameterFactory("@entVal", SqlParamInOrOut.Input, SqlDbType.Money); 
    SqlParameter trailingPE = SqlParameterFactory("@trailingPE", SqlParamInOrOut.Input, SqlDbType.Decimal); 
    SqlParameter forwardPE = SqlParameterFactory("@forwardPE", SqlParamInOrOut.Input, SqlDbType.Decimal); 

    symbol.Value = dp.Symbol; 
    dateAdded.Value = dp.TradeDate; 
    tradeDate.Value = dp.TradeDate; 
    marketCapIntra.Value = dp.MarketCapIntraDay; 
    entVal.Value = dp.EntValue; 
    trailingPE.Value = dp.TrailingPE; 
    forwardPE.Value = dp.ForwardPE; 

    List<SqlParameter> sqlParams = new List<SqlParameter> {symbol, dateAdded, tradeDate, marketCapIntra, entVal, trailingPE, forwardPE}; 

    ExecuteSproc("spAddKeyStatDP", sqlParams, SqlConnection); 
} 

private static SqlParameter SqlParameterFactory (String ParamName, SqlParamInOrOut Direction, 
    SqlDbType SqlType) 
{ 
    SqlParameter param = new SqlParameter 
    { 
     ParameterName = ParamName, 
     SqlDbType = SqlType 
    }; 

    if (Direction == SqlParamInOrOut.Input) 
     param.Direction = ParameterDirection.Input; 
    else 
     param.Direction = ParameterDirection.Output; 

    return param; 
} 

private static void ExecuteSproc(String CommandName, List<SqlParameter> ParamList, SqlConnection SqlConn, int Timeout = 0) 
{ 
    using (SqlCommand cmd = new SqlCommand(CommandName, SqlConn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     foreach (SqlParameter sp in ParamList) 
     { 
       if (sp.Value == null) 
       sp.Value = DBNull.Value; 
       cmd.Parameters.Add(sp); 
     } 

       cmd.CommandTimeout = Timeout; 
       cmd.ExecuteNonQuery(); 
     } 
    } 
} 
+0

讓我們來看看一些代碼。我假設你正在將某個存儲過程的結果讀入某個類中? – Thelonias 2012-07-31 14:37:01

+0

問題很可能是sql,而不是.net,因爲數字和小數是DB類型。您是否使用存儲過程返回數據或更改數據?有沒有任何計算值。無論是輸入參數,還是需要確定計算結果。 – 2012-07-31 14:40:02

+0

@Ryan謝謝,我在上面添加了代碼,希望它有幫助。你會看到,它將一個類實例添加到數據庫中作爲記錄。 – StatsViaCsh 2012-07-31 15:09:35

回答

1

我沒有在你的代碼中看到70個參數,但假設你有70個參數,這裏有一些指向調試的指針。

1)由於這是一個十進制轉換錯誤,並且假設最常見的精度不足以支持您的值,您可以編寫一個快速腳本並在sql server中運行它以查看哪一個出錯。
未經測試以下腳本:

StringBuilder sb = new StringBuilder(); 
      foreach (SqlParameter param in sqlParams) 
      { 
       sb.Append("declare " + param.ParameterName + " as " + param.SqlDbType + Environment.NewLine); 
       sb.Append("set " + param.ParameterName + " = " + param.Value + Environment.NewLine); 
      } 
      string sqlTestString = sb.ToString(); 

2)您可以使用SQL事件探查器查看執行過程中已經傳遞到SQL服務器的參數。您還可以使用SQL分析器提供的其他調試信息。

3)不是所有的參數都是十進制的。假設你有一個20-30%十進制參數的經典情況,那將達到14-20個參數。有時候,手動檢查它們是值得的。

1

你可以調試SQL Server存儲從Visual過程工作室。這裏是Knowledge Base的文章如何去做。也許那麼你會很容易找出哪個參數出現故障

1

也許你可以設置參數的數量和規模,並檢查其值導致異常

相關問題