større Stored Procedure problem
Vi har en række små stored procedures der skal køres fra en metode, det fungere fint fra c#, men ville gerne have det banket sammen til en stored procedure. Jeg skal i en bug tabel tilføje en bug, hvis der er nogle billed attachments til denne bug, så skal dette array af attachments tilføjes i en bugAttachment tabel, hvor en af kolonnerne er det BugID identity som blev lavet da vi tilføjet buggen. Hvis noget i denne process fejler vil vi ikke have det commit'et, og vi vil meget gerne vide over i vores c# kode om proceduren fejlede eller ej.Min C# metode ser sådan her ud:
public bool addBug(int btid,string bdesc,int pid,int cid, byte[][] attach)
{
bool check=true;
try
{
conn.Open();
}
catch(Exception e)
{
Console.WriteLine(e.ToString());
conn.Close();
check=false;
return check;
}
//Starting a Transaction to make it possible to commit/rollback
//if any parts of the method fails
OleDbTransaction trans = conn.BeginTransaction();
try
{
//Adding bug info to the tblBug table
OleDbCommand cmd = new OleDbCommand("addBug", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@BugTypeID", OleDbType.Integer).Value=btid;
cmd.Parameters.Add("@BugDescription", OleDbType.VarChar).Value=bdesc;
cmd.Parameters.Add("@BugDescReply", OleDbType.VarChar).Value=DBNull.Value;
cmd.Parameters.Add("@BugStatusID", OleDbType.Integer).Value=1;
cmd.Parameters.Add("@BugReportDate", OleDbType.DBTimeStamp).Value=DateTime.Now;
cmd.Parameters.Add("@BugFixedDate", OleDbType.DBTimeStamp).Value=DBNull.Value;
cmd.Parameters.Add("@BughandlerID", OleDbType.Integer).Value=1;
cmd.Parameters.Add("@ProjectID", OleDbType.Integer).Value=pid;
cmd.Parameters.Add("@CustomerID", OleDbType.Integer).Value=cid;
cmd.Parameters.Add("@BugAttachmentCount", OleDbType.Integer).Value=0;
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
//Retrieves the last generated identity, which is the BugID generated above
cmd = new OleDbCommand("SELECT @@IDENTITY",conn);//XXXXX
cmd.Transaction = trans;
OleDbDataReader dbReader = cmd.ExecuteReader();
dbReader.Read();
int bugID = Convert.ToInt32(dbReader.GetValue(0));
dbReader.Close();
//Adds the array of attachments to the database
if(attach!=null)
{
for(int index=0;index<attach.Length;index++)
{
cmd = new OleDbCommand("addAttachment", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@BugTypeID", OleDbType.Integer).Value=bugID;
cmd.Parameters.Add("@BugAttachment", OleDbType.VarBinary, attach[index].Length).Value = attach[index];
Console.WriteLine(index);
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
}
}
//Commits the transaction if everything was succesful
trans.Commit();
}
//the transactions rolls back if anything fails
catch(Exception e)
{
Console.WriteLine("Exception caught in AddBug()\n"+e.Message+"\n\n"+e.ToString());
check=false;
trans.Rollback();
}
finally
{
conn.Close();
}
return check;
}
De to stored procedures denne metode kører ser sådan ud:
CREATE PROCEDURE addBug @BugTypeID integer, @BugDescription text, @BugDescReply text, @BugStatusID integer, @BugReportDate smalldatetime, @BugFixedDate smalldatetime, @BughandlerID integer, @ProjectID integer, @CustomerID integer, @BugAttachmentCount integer
AS
INSERT INTO tblBugs VALUES(@BugTypeID, @BugDescription, @BugDescReply, @BugStatusID, @BugReportDate, @BugFixedDate, @BughandlerID, @ProjectID, @CustomerID, @BugAttachmentCount)
------
CREATE PROCEDURE addAttachment @BugID integer, @BugAttachment Image
AS
INSERT INTO tblBugAttachments VALUES(@BugID, @BugAttachment)
UPDATE tblBugs
SET BugAttachmentCount = BugAttachmentCount+1
WHERE BugID=@BugID
GO
Mine problemer er så:
- Hvordan returnere jeg en boolean værdi der fortæller om det hele gik godt eller ej
- Hvordan får vi vores stored procedure til at tage et byte[][] som parameter
Stil spørgsmål hvis forklaringen ikke er helt klar