Мне трудно понять, какой тип данных я бы использовал в С# для ввода данных в мою таблицу в моей базе данных, которая содержит десятичное число (5,2). Когда я попытался использовать десятичный тип данных С#, он сказал, что произошла ошибка при преобразовании числовых значений в десятичные. Когда я попробовал строку, она сказала, что не может преобразовать nvarchar в десятичную. Когда я попробовал float... Произошло то же самое, за исключением того, что оправданием был «настоящий» тип данных. двойной тоже не сработал.
У меня есть хранимая процедура, которая вводит данные в мою таблицу, но прежде чем я запускаю и привожу типы данных в моей хранимой процедуре к фактическому десятичному числу, есть ли другой способ, которым я могу преобразовать тип данных С#, чтобы он соответствовал моему десятичному числу ( 5,2) поле?
private void btnAddClientComputer_Click(object sender, EventArgs e)
{
SQLCommands comm = new SQLCommands();
try
{
comm.AddClientComputer(int.Parse(cbCustomerID.Text), cbAction.Text, decimal.Parse(tbCost.Text));
}
catch (FormatException)
{
MessageBox.Show("The cost you have entered is invalid. Please ensure the cost is above 0, and is an actual number", "Invalid Input at Cost", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
}
}
...
public void AddClientComputer(int CustomerID, string Action, decimal Cost)
{
try
{
comm = new SqlCommand("UspAddClientComputer", conn); // Stored Procedure - see sql file
comm.Parameters.AddWithValue("@CustomerID", CustomerID);
comm.Parameters.AddWithValue("@Action", Action);
comm.Parameters.AddWithValue("@Cost", Cost);
comm.CommandType = CommandType.StoredProcedure;
comm.ExecuteNonQuery();
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message, "Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
}
}
...
CREATE TABLE ClientComputers
(ClientComputerID int Identity(1,1) primary key clustered
,CustomerID int
,Action varchar(7) check (Action = 'Upgrade' OR Action = 'Store')
,Cost decimal(5,2) check (Cost > 0)
,Constraint FKCustomerComputer FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID));
Go
...
CREATE PROCEDURE uspAddClientComputer @CustomerID int, @Action varchar(7), @Cost decimal(5,2)
AS
BEGIN TRY
BEGIN TRANSACTION TrnAddClientComputer;
INSERT INTO [TCTdb].[dbo].[ClientComputers]
([CustomerID]
,[Action]
,[Cost])
VALUES
(@CustomerID
,@Action
,@Cost)
COMMIT TRANSACTION TrnAddClientComputer;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION TrnAddClientComputer;
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
END CATCH
GO
decimal
был бы логичным и наиболее подходящим выбором... можете ли вы показать нам какой-нибудь код, который вызвал эту ошибку, которая у вас была?? - person marc_s   schedule 01.08.2011DECIMAL(5,2)
- какой диапазон значений вы ожидаете, что этот тип сможет удерживать ?? Есть ли шанс, что вы можете ожидать 5 цифр до и 2 цифры после запятой? Это было бы неверно - dec(5,2) означает: 5 цифр всего, 2 из которых после запятой - так что вы ограничиваете себя значениями до макс.999.99
. Может ли это быть ядром проблемы в конце концов?? - person marc_s   schedule 01.08.2011