FileStream stream;
BinaryWriter writer;
long retval;
long startIndex = 0;
int bufferSize = 2000;
byte[] aBytes = new byte[bufferSize];
string Name = "";
using (SqlConnection cn = new SqlConnection(this.ConnectionString))
{
SqlCommand cmd = new SqlCommand("as_Table_GetModelByID", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@ID", SqlDbType.Int).Value = id;
cn.Open();
IDataReader reader = ExecuteReader(cmd, CommandBehavior.SequentialAccess);
if (reader.Read())
{
Name = reader.GetString(0);
stream = new FileStream(
"File_" + Name + ".jpg", FileMode.OpenOrCreate, FileAccess.Write);
writer = new BinaryWriter(stream);
startIndex = 0;
retval = reader.GetBytes(1, startIndex, aBytes, 0, bufferSize);
while (retval == bufferSize)
{
writer.Write(aBytes);
writer.Flush();
startIndex += bufferSize;
retval = reader.GetBytes(1, startIndex, aBytes, 0, bufferSize);
}
writer.Write(aBytes, 0, (int)retval - 1);
writer.Flush();
writer.Close();
stream.Close();
}
Опять "бинарные файлы в базу"
Подскажите пожалуйста почему не получается считать бинарные данные из поля базы ?
Первое строковое поле считывает, а у второго поля типа VarBinary считывает только первый байт.
И не знаю как посмотреть что реально лежит в таблице базы. В SQL Server Managment Studio видно только <Binary data> :(
Считываю данные как в примере MSDNа:
(ASP.NET, C#, VS 2005, база на MS SQL Server Express Edition)
Код:
Хранимая процедура
Код:
ALTER PROCEDURE dbo.as_Table_GetModelByID
(
@ID int
)
AS
SET NOCOUNT ON
SELECT as_Table.Name, as_Table.Model
FROM as_Table
WHERE
ID = @ID
(
@ID int
)
AS
SET NOCOUNT ON
SELECT as_Table.Name, as_Table.Model
FROM as_Table
WHERE
ID = @ID
Сохраняю маленькую (1,5КБ) картинку формата JPG в таблицу так:
Код:
...
byte[] aBytes;
BinaryReader br = new BinaryReader(fileStream);
aBytes = br.ReadBytes((int)fileStream.Length);
using (SqlConnection cn = new SqlConnection(this.ConnectionString))
{
SqlCommand cmd = new SqlCommand("as_Table_Insert", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = Name;
cmd.Parameters.Add("@Model", SqlDbType.VarBinary).Value = aBytes;
cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output;
cn.Open();
int ret = ExecuteNonQuery(cmd);
return (int)cmd.Parameters["@ID"].Value;
}
byte[] aBytes;
BinaryReader br = new BinaryReader(fileStream);
aBytes = br.ReadBytes((int)fileStream.Length);
using (SqlConnection cn = new SqlConnection(this.ConnectionString))
{
SqlCommand cmd = new SqlCommand("as_Table_Insert", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = Name;
cmd.Parameters.Add("@Model", SqlDbType.VarBinary).Value = aBytes;
cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output;
cn.Open();
int ret = ExecuteNonQuery(cmd);
return (int)cmd.Parameters["@ID"].Value;
}
Хранимая процедура выглядит так :
Код:
ALTER PROCEDURE dbo.as_Table_Insert
(
@Name nvarchar(256),
@Model varbinary,
@ID int OUTPUT
)
AS
SET NOCOUNT ON
INSERT INTO as_Table
(Name, Model)
VALUES
(@Name, @Model)
SET @ID = scope_identity()
(
@Name nvarchar(256),
@Model varbinary,
@ID int OUTPUT
)
AS
SET NOCOUNT ON
INSERT INTO as_Table
(Name, Model)
VALUES
(@Name, @Model)
SET @ID = scope_identity()