PDA

View Full Version : سوال: عدم نمایش مقدار برگشتی استرینگ در وبسرویس



slr560
پنج شنبه 08 مرداد 1394, 22:03 عصر
سلام دوستان
من یه متد دارم توی وبسرویسم که از SQL یه سطر میخونه و اونو توی وبسرویس نشون میده
نوع داده ای که میخونه یه استرینگ خیلی بزرگ هست. (در واقع عکس هست که به استرینگ تبدیل شده)
مشکل اینجاس که استرینگ رو میخونه و توی متغییر s هم میریزه ولی توی وبسرویس نشونش نمیده. با debug چک کردم و کامل استرینگ رو میخوند
کسی میتونه کمک کنه؟ راه بهتری واسه خوندن استرینگ های بزرگ هم هست؟

public string GetImage(int meliNumber)
{
var commandText = "SELECT Image FROM Naji.dbo.Images WHERE MeliNumber = " + meliNumber;
string s = "";
using (var connection = new SqlConnection(connStr))
{
try
{
var command = new SqlCommand(commandText, connection);
connection.Open();
var dataReader = command.ExecuteReader();
if (dataReader.HasRows)
{
while (dataReader.Read())
{
s = dataReader.GetValue(0).ToString();
}
dataReader.Close();
return JsonConvert.SerializeObject(s);
}
return "0";
}
catch (SqlException e)
{
return e.Message;
}
finally
{
connection.Close();
}
}
}

Mahmoud.Afrad
جمعه 09 مرداد 1394, 13:03 عصر
مطمئن هستید مقدار متغیر s محتوا رو داره نه چیز دیگه ای؟
مقداری که از dataReader.GetValue(0) بدست میاد از نوع object هست و در صورتی که متد ToString() رو استفاده کنید نوع متغیر(Byte[]) بدست میاد نه محتوا.
به اینصورت بنویس

object obj = null;
if (dataReader.Read())
{
obj = dataReader.GetValue(0);
}
dataReader.Close();
return JsonConvert.SerializeObject(obj);


و سوال اینکه چرا string ؟

slr560
جمعه 09 مرداد 1394, 13:14 عصر
مطمئن هستید مقدار متغیر s محتوا رو داره نه چیز دیگه ای؟
مقداری که از dataReader.GetValue(0) بدست میاد از نوع object هست و در صورتی که متد ToString() رو استفاده کنید نوع متغیر(Byte[]) بدست میاد نه محتوا.
به اینصورت بنویس

object obj = null;
if (dataReader.Read())
{
obj = dataReader.GetValue(0);
}
dataReader.Close();
return JsonConvert.SerializeObject(obj);


و سوال اینکه چرا string ؟

ممنون بابت پاسخ.
مسئله گرفتن استرینگ از datareader نیست.
به جای executeReader() میشه از executeScalar() استفاده کرد که میاد فقط یه سطر میگیره . همون موقع هم به استرینگ cast میکنی و توی یه متغییر استرینگ میریزی
تا اینجا همه چی درسته و توی دیباگ کردنم اون مقدار استرینگ رو کامل نشون میده

اصلا بزارید کل ماجرا رو بگم. من سمت اندروید دارم یه عکس رو با base64 به استرینگ تبدیل میکنم و از طریق وبسرویس داخل دیتابیس ذخیره میکنم. نوع داده ای که توی دیتابیس ذخیره میشه varchar MAX هست
تا اینجا مشکلی نیست و استرینگ توی دیتابیس ذخیره میشه
مشکل از این به بعده . طبق گفته های قبلیم من با یه دستور select این فیلد رو میخونم و توی یه استرینگ میریزم
مشکل اینجاس این استرینگ توی وبسرویس برگشت داده نمیشه. یعنی خالیه مقدار برگشتیش
جاهایی خوندم باید از memory strem استفاده کنم. ولی بازم نشد
راه حل واسه این مشکل دارید؟ یا یک مثال نمونه

Mahmoud.Afrad
جمعه 09 مرداد 1394, 16:21 عصر
خب من فکر کردم ستون از نوع varbinary هست.


روی local هم تست کردی؟
اگر میتونی روی local روی یک پروژه امتحانی تست کن و اگر باز هم مشکلی داشتی پروژه رو بزار.
کد ذخیره و کد کلاینت (جایی که از این سرویس استفاده میکنی) رو هم بزار.

slr560
دوشنبه 12 مرداد 1394, 20:25 عصر
خب من فکر کردم ستون از نوع varbinary هست.


روی local هم تست کردی؟
اگر میتونی روی local روی یک پروژه امتحانی تست کن و اگر باز هم مشکلی داشتی پروژه رو بزار.
کد ذخیره و کد کلاینت (جایی که از این سرویس استفاده میکنی) رو هم بزار.

شرمنده به اینترنت دسترسی نداشتم
این کد ذخیره عکس توی وبسرویسم .
public string SaveImage(int meliNumber, string string64) {
var commandText = "INSERT INTO Naji.dbo.Images (MeliNumber,Image) VALUES (@param1,@param2)";
using (var connection = new SqlConnection(connStr))
{
try
{
var command = new SqlCommand(commandText, connection);
command.Parameters.AddWithValue("@param1", meliNumber);
command.Parameters.AddWithValue("@param2", string64);
connection.Open();
command.ExecuteNonQuery();
return "1";
}
catch (SqlException)
{
return "2";
}
finally
{
connection.Close();
}


}
}

چند جا دیدم توی نت اینجوری عکسو ذخیره میکنن . نمیدونم درسته یا نه.
شما چه پیشنهادی دارید؟
عکس باید از سمت اندروید ارسال بشه و سمت سرور ذخیره
دریافت عکس هم نیازه

ژیار رحیمی
دوشنبه 12 مرداد 1394, 20:54 عصر
دوست گرامی عکس رو بخوای تو دیتابیس قرار بدی باید آرایه ای از بایت ها تبدیل کنی []byte این روش معمول ذخیره سازی تو دیتابیس هست.درسته جایی خوندی که از memory stream استفاده کنی روش درست پیاده سازیش اینطوره
من خودم از این توابع جهت تبدیل []byte به Image وبالعکس استفاده کردم و تست شده س میتونی استفاده کنی

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}



اگه درست متوجه شدم شما میخوای تصویر رو بصورت رشته دراری و به صورت جیسون به سرور بفرستی؟

slr560
دوشنبه 12 مرداد 1394, 21:05 عصر
دوست گرامی عکس رو بخوای تو دیتابیس قرار بدی باید آرایه ای از بایت ها تبدیل کنی []byte این روش معمول ذخیره سازی تو دیتابیس هست.درسته جایی خوندی که از memory stream استفاده کنی روش درست پیاده سازیش اینطوره
من خودم از این توابع جهت تبدیل []byte به Image وبالعکس استفاده کردم و تست شده س میتونی استفاده کنی

public byte[] ImageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
return ms.ToArray();
}
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}



اگه درست متوجه شدم شما میخوای تصویر رو بصورت رشته دراری و به صورت جیسون به سرور بفرستی؟

اره میخوام عکسو به صورت جیسون بفرستم
بلاخره تهش باید به صورت رشته دربیاد و از طریق جیسون ارسال بشه دیگه. خب من همون اول به صورت رشته ذخیرش میکنم و بعد رشته ها رو از دیتابیس میگیرم و به صورت جیسون ارسال میکنم.
راه دیگری هم هست؟ اگه میشه راهنمایی کنید
اگه میشه قسمت ذخیره و بازیابیشو توی دیتابیس یه توضیحی بدید.

ژیار رحیمی
دوشنبه 12 مرداد 1394, 21:42 عصر
نوع فیلد Image در دیتابیس رو varbinary(MAX) بزار با استفاده از دو تابع ارسالی تصویر رو به آرایه ایی از بایت ها تبدیل کن فقط به جای پارامتر ورودی تابع SaveImage خودت(string string64) آرایه از بایت ها []byte تبدیل کن .کد sql خودت درسته مشکلی نداره .ولی به نظر من کنار وب سرویست یه پوشه واسه تصاویر موقت که هنوز در دیتابیس ذخیره نشده اند بساز و عکس رو Upload کن تو این پوشه و بعد متد SaveImage از وب سرویس رو فراخوانی کن و بعد از کار ذخیره سازی فایل موقت تصویر رو از تو پوشه حذف کن.حالت عکس آن هم به این صورت باشه که شما عکس رو از دیتابیس میخونی همونجا رو سرور داخل پوشه tempی که بهت گفتم فایل تصویر رو بساز و بعد فایل تصویر رو به سمت کلاینت بفرست و وقتی فایل ارسال شد دوباره فایل تصویر رو تو پوشه حذف کن.به نظر من این روش بهتر است تا به روش جیسون عکس بفرستی.لازم به ذکر است شما تابع دیگه ای هم بنام ReadImage لازم داری که تصویر ذخیره شده در دیتابیس رو برگرداند و یه فایل Image بسازد