View Full Version : C#+SQLstoredProcedure


mrbabs
11-06-2008, 20:00
Viva, estou a tentar utilizar uma stored procedure num programa em C# que insira um fx numa bd, mas estou com um pequeno problema. isto que eu escrevi, supostamente estaria correcto! (digo eu :P) :S o codigo que trata os parametros, é este, e a stored procedure vem logo a seguir! o Erro que me está a dar, prende-se com o facto de supostamente a storedprocedure que estou a invocar estar á espera do parametro @p_FileID, mas como podem ver, ele está a ser tratado no meu codigo! :S

......

using (SqlConnection cnn = new SqlConnection(cnnStr.Text))
{
using (SqlCommand cmd = new SqlCommand("[Files_Insert]", cnn))
{
FileStream fs = File.Open(tbFile.Text, FileMode.Open, FileAccess.Read);
int length = (int)fs.Length + 1;
fs.Close();

cmd.CommandType = CommandType.StoredProcedure;

SqlParameter prm = new SqlParameter("@P_FILE_ID", SqlDbType.UniqueIdentifier, 16);
prm.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(prm);

prm = new SqlParameter("@P_FILE", SqlDbType.VarBinary, length);
prm.Value = File.ReadAllBytes(tbFile.Text);
cmd.Parameters.Add(prm);

cnn.Open();
int i = cmd.ExecuteNonQuery();

}
}
.....

Stored Procedure:


ALTER PROCEDURE [dbo].[Files_Insert](
@P_FILE_ID uniqueidentifier output,
@P_FILE varbinary(MAX))
AS
BEGIN
DECLARE @GUID uniqueidentifier
SET @GUID = NEWID()

SET NOCOUNT ON;
INSERT INTO [FILE_VALUE]
(
FILE_ID,
[FILE]
)
VALUES
(
@GUID,
@P_FILE
)
SET @P_FILE_ID = @GUID

END

erro:

http://lh5.ggpht.com/marioajmoreira/SFARwidm2aI/AAAAAAAAAbs/3dv6QmapQbY/Sem%20t%C3%ADtulo.GIF

se alguem me puder dar uma ajudinha! eu fico mt agradecido! :D

file:///C:/DOCUME%7E1/PAULOS%7E1/DEFINI%7E1/Temp/moz-screenshot.jpg

samouco
12-06-2008, 17:12
Boas.

Em vez de usares esse "comboio" usa antes:



int pFileId = 0;

cmd.Parameters.AddWithValue("@p_file_id", pFileId).Direction = ParameterDirection.InputOutput;

cmd.Parameters.AddWithValue("@p_file",length);

cmd.ExecuteNonQuery();

pFileId = Convert.ToInt32( cmd.Parameters["@p_file_id"].Value);



Assim deve funcionar... O problema é q não estás a passar o parametro pFileId

mrbabs
13-06-2008, 16:06
Viva, realmente com a tua sugestão foi mais facil de chegar ao resultado pretendido! no entanto a tua sugestão não estava correcta, apesar de ser esse o caminho! isto porque, como podes ver no codigo da stored procedure, o campo File_ID é uma variavel do tipo uniqueidentifier, assim sendo tive que alterar esse parametro de modo a ser aceite na stored e de modi a ser returnado nos parametros do comando sql. assim sendo, ficou qq coisa deste genero:

....
FileInfo fi = new FileInfo(tbFile.Text);
StreamReader sr = fi.OpenText();
string str = (string)sr.ReadToEnd(); // File Content, this should be Binary data
byte[] stream = ConvertToByte(str, str.Length);

cmd.Parameters.AddWithValue("@p_file_id", new System.Guid()).Direction = ParameterDirection.InputOutput;
cmd.Parameters.AddWithValue("@p_file", stream);

cnn.Open();
cmd.ExecuteNonQuery();

....

Desde já o meu muito Obrigado :)

samouco
16-06-2008, 21:30
De nada :)