Jag lägger till data i en databas och får felmeddelandet "Indatasträngen hade ett felaktigt format.". Produkten läggs ändå in databasen, men är ju tråkigt att få felmeddelandet. Allt skickas inte med, men de värdena är satta till null, så det ska ju inte ha nån betydelse och de får vara null i databasen. Borde du inte få någon information om var det kapsejsar? Btw, lägg all sql i en transaktion eller något så slipper du halvdana grejjer Det ligger i en transaction Jag hade ju min vana trogen ändrat nåt nånstans så klart. id = Int32.Parse(comm.Parameters["@identity"].Value.ToString()); varför inte bara returnera @@identity och kalla executescalar() istället för executenonquery()? Kör gärna inte med @@IDENTITY, utan istället med SCOPE_IDENTITY.Fel men ädå rätt
<code>
// .cs
try
{
string name = txtProdname.Text;
string desc = Request.Form["elm1"];
string prodNumber = txtArtNr.Text;
double price = double.Parse(txtPrice.Text);
int quant = int.Parse(txtQuantity.Text);
bool depart = bool.Parse(ddlDepartment.SelectedValue.ToString());
bool catalog = bool.Parse(ddlCatalog.SelectedValue.ToString());
int catID = int.Parse(Request.QueryString["categoryID"].ToString());
int manifactureID = int.Parse(ddlManifacture.SelectedValue.ToString());
bool toPrint = bool.Parse(ddlPrint.SelectedValue.ToString());
int outID = 0;
int result = int.Parse(CatalogAccess.AddProduct(fn, true, name, desc, catID, prodNumber, price, quant, catalog, depart, outID, toPrint, manifactureID).ToString());
lblStatus.Text += "Produkten är sparad";
bindGrid();
}
catch (Exception ex)
{
lblStatus.Text = ex.Message;
}
// DB klassen
public static int AddProduct(string picPath, bool showPic, string name, string desc, int catID, string artNumber, double price, int quant, bool catalog, bool depart, int id, bool toPrint, int manifactureID)
{
DbCommand comm = GenericDataAccess.CreateCommand();
comm.CommandText = "addProduct";
DbParameter param = comm.CreateParameter();
param = comm.CreateParameter();
param.ParameterName = "@picPath";
param.Value = picPath;
param.DbType = DbType.String;
param.Size = 150;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@showPic";
param.Value = showPic;
param.DbType = DbType.Boolean;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@catID";
param.Value = catID;
param.DbType = DbType.Int32;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@name";
param.Value = name;
param.DbType = DbType.String;
param.Size = 50;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@desc";
param.Value = desc;
param.DbType = DbType.String;
param.Size = 2000;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@prodNumber";
param.Value = artNumber;
param.DbType = DbType.String;
param.Size = 50;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@price";
param.Value = price;
param.DbType = DbType.Double;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@quantity";
param.Value = quant;
param.DbType = DbType.Int32;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@manifactureID";
param.Value = manifactureID;
param.DbType = DbType.Int32;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@catalogPro";
param.Value = catalog;
param.DbType = DbType.Boolean;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@toPrint";
param.Value = toPrint;
param.DbType = DbType.Boolean;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@departmentPro";
param.Value = depart;
param.DbType = DbType.Boolean;
comm.Parameters.Add(param);
param = comm.CreateParameter();
param.ParameterName = "@identity";
param.DbType = DbType.Int32;
param.Direction = ParameterDirection.Output;
comm.Parameters.Add(param);
GenericDataAccess.ExecuteNonQuery(comm);
id = Int32.Parse(comm.Parameters["@identity"].Value.ToString());
return id;
}
SP:
ALTER PROCEDURE addProduct
@picPath VARCHAR(150) = null,
@showPic BIT = null,
@catID INT,
@name VARCHAR(50),
@desc VARCHAR(2000),
@prodNumber VARCHAR(50),
@price MONEY,
@quantity INT,
@catalogPro BIT,
@departmentPro BIT,
@colorID INT = null,
@sizeID INT = null,
@manifactureID INT,
@toPrint BIT,
@identity INT OUTPUT
AS
DECLARE @newProdID INT
IF(EXISTS(SELECT productID FROM products WHERE productNumber = @prodNumber))BEGIN
RAISERROR('Det finns redan en produkt med detta artikelnummer!', 16, 1)
RETURN
END
ELSE BEGIN
BEGIN TRAN
IF(@colorID IS NULL AND @sizeID IS NULL)BEGIN
INSERT INTO products(manifactureID, productName, productNumber, productDesc, price, quantity, onCatalogPromotion, onDepartmentPromotion)
VALUES(@manifactureID, @name, @prodNumber, @desc, @price, @quantity, @catalogPro, @departmentPro)
SET @newProdID = @@IDENTITY
IF(@@error <> 0)GOTO noInsert
END
ELSE BEGIN
INSERT INTO products(manifactureID, productName, productNumber, productDesc, price, onCatalogPromotion, onDepartmentPromotion)
VALUES(@manifactureID, @name, @prodNumber, @desc, @price, @catalogPro, @departmentPro)
SET @newProdID = @@IDENTITY
IF(@@error <> 0)GOTO noInsert
INSERT INTO clothesDetails(prodID, sizeID, colorID, quant)
VALUES(@newProdID, @sizeID, @colorID, @quantity)
IF(@@error <> 0)GOTO noInsert
END
INSERT INTO productCategory(productID, categoryID)
VALUES(@newProdID, @catID)
IF(@@error <>0)GOTO noInsert
IF(@picPath is not null)BEGIN
INSERT INTO prodPics(prodID, picPath, showPic)
VALUES(@newProdID, @picPath, @showPic)
IF(@@error <> 0)GOTO noInsert
END
COMMIT TRAN
END
noInsert:
IF(@@error <> 0)BEGIN
ROLLBACK TRAN
RAISERROR('Det gick inte att lägga till produkten', 16, 1)
RETURN
END
</code>Sv: Fel men ädå rätt
Sv:Fel men ädå rätt
ELSE BEGIN
BEGIN TRAN
IF(@colorID IS NULL AND @sizeID IS NULL)BEGIN
Det är allt jag får som fel. Tycker det är märkligt, brukar ju alltid vara med vad som blir fel och var.
EDIT
Jagtog bort det från try-satsen och får då att det är här det är fel.
id = Int32.Parse(comm.Parameters["@identity"].Value.ToString());Sv: Fel men ädå rätt
I SP satt jag ju @newProdID = @@IDENTITY så returnerade jag det, det jag skulle returnera var ju givetvis @identitySv:Fel men ädå rätt
Den raden skulle jag f ö skriva så här :
id = (int)comm.Parameters["@identity"].Value;
Onödigt att först konvertera till sträng och sedan parsa när du redan returnerar ett (boxat) integer...Alternativt så föredrar jag oftast TryParse i st för Parse då det gör det enklare att felhantera:
if (System.Int32.TryParse(comm.Parameters["@identity"].Value, id))
' Gick bra
else
' Gick fel, ej numeriskt, el för stort/litet värde
[Edit: skrev om svaret till C# i st f VB...]Sv: Fel men ädå rätt
Sv:Fel men ädå rätt
SCOPE_IDENTITY ger sista id för det tillfälliga scopet, medans @@IDENTITY inte är begränsat till det tillfälliga scopet, så det innebär att du kan få fel id när frågan är klar.
Mvh Fredrik Normén
MVP - MEET - ASPInsiders
http://weblogs.asp.net/fredriknormen