У вас неправильный запрос. Вы не можете передать таблицу как переменную так, как пытаетесь. Чтобы достичь такого типа функциональности, вы должны использовать string.Fromat
.
Попробуйте что-то вроде:
using (var cmd = new SqlCommand())
{
connection.Open();
cmd.Connection = connection;
cmd.CommandType = CommandType.Text;
cmd.CommandText = string.Join(
string.Fromat("SELECT * FROM {0} ",DbTable),
"WHERE TransactionDateTime <= @DateTime ",
"AND AcquirerID = @Region ",
"AND MerchantCategoryCode = @MCC",
"AND MerchantID = @MerchantId ",
"AND Currency = @TxnCurrency ",
"AND TerminalID = @TerminalId ",
"AND TransactionAmount = @TxnAmount ",
"AND Bin = @Bin ",
"AND MessageType = @MsgType ",
"AND ProcessingCode = @ProcessingCode ",
"AND PANM = @Panm ",
"AND PAN = @Pan ",
"AND ResponseCode = @ResponseCode ",
"AND AuthorizationCode = @AuthCode ",
"AND ResponseCode = @ResponseCode");
cmd.Parameters.AddWithValue("@DateTime", transactionDate);
cmd.Parameters.AddWithValue("@Region", Region);
cmd.Parameters.AddWithValue("@MCC", MCC);
cmd.Parameters.AddWithValue("@MerchantId", MerchantID);
cmd.Parameters.AddWithValue("@TxnCurrency", TxnCurrency);
cmd.Parameters.AddWithValue("@TerminalId", TerminalID);
cmd.Parameters.AddWithValue("@TxnAmount", TxnAmount);
cmd.Parameters.AddWithValue("@Bin", BIN);
cmd.Parameters.AddWithValue("@MsgType", MsgType);
cmd.Parameters.AddWithValue("@ProcessingCode", ProcessingCode);
cmd.Parameters.AddWithValue("@Panm", MaskedPan);
cmd.Parameters.AddWithValue("@Pan", ClearPan);
cmd.Parameters.AddWithValue("@ResponseCode", ResponseCode);
cmd.Parameters.AddWithValue("@AuthCode", AuthorizationCode);
cmd.Parameters.AddWithValue("@ResponseCode", ResponseCode);
queryable = (List<TransactionJournal>)cmd.ExecuteScalar();
}
Вам не нужно использовать string.Join
, как я. Я просто хотел разделить запрос на части, чтобы сделать его более читабельным для меня. Вы можете отформатировать все виды способов.
Когда это возможно, я бы порекомендовал вам написать свои запросы и протестировать их на SQL сервере или локальном экземпляре. Затем вы можете использовать его для создания текстовой строки вашей команды.
Нечто подобное могло бы помочь вам обнаружить проблему:
DECLARE @Table varchar(50) = 'TRANSACTIONJOURNAL_202003',
@DateTime datetime = GETDATE(),
-- ... And so on with the rest of the variables you need
-- you have lots of variables
-- you get the gist
SELECT * FROM Table = @Table
WHERE TransactionDateTime <= @DateTime
AND AcquirerID = @Region
AND MerchantCategoryCode = @MCC
AND MerchantID = @MerchantId
AND Currency = @TxnCurrency
AND TerminalID = @TerminalId
AND TransactionAmount = @TxnAmount
AND Bin = @Bin
AND MessageType = @MsgType
AND ProcessingCode = @ProcessingCode
AND PANM = @Panm
AND PAN = @Pan
AND ResponseCode = @ResponseCode
AND AuthorizationCode = @AuthCode
AND ResponseCode = @ResponseCode;
Еще одна вещь. Я бы порекомендовал не использовать SELECT *
. Вместо этого я бы явно выписал имена столбцов. Если они когда-нибудь добавят другой столбец в эту таблицу, это может сломать вещи. Особенно, если они меняют порядок столбцов.
Надеюсь, это поможет.