PDA

View Full Version : ذخيره فايل صوتي در دیتابیس



Sajjad.Aghapour
سه شنبه 11 تیر 1387, 14:49 عصر
سلام دوستان....
می خواستم نحوه ذخیره صوت در دیتابیس رو بدونم ...

allameh
چهارشنبه 12 تیر 1387, 10:29 صبح
ابتدا در database در table مورد نظر یک فیلد از نوع image درست میکنی مثل PrimaryPath سپس


آدرس فایل صوتی که از نوع wave است را توسط کد زیر به متغیری از نوع byte میدهی

buffer1 = File.ReadAllBytes(txt_path.Text);


س
DataTable dt = new DataTable();
newRow = dt.NewRow();
newRow["PrimaryPath"] = buffer1;
dt.Rows.Add(newRow);


اصولا برای ذخیره فایل آن را به صورت byte در می آوریم و بهد به فیلد نسبت میدهیم.

yasercomeng
چهارشنبه 12 تیر 1387, 11:41 صبح
البته منظور از نوع داده image همون نوع داده BLOB تویه sql هست.
بقیه مطلب هم کاملا درست است.

Sajjad.Aghapour
چهارشنبه 12 تیر 1387, 12:42 عصر
دوست عزیز ممنون....
کلا اینطوری شد.اگه دوستان دیگه هم می خوان استفاده کنن......

ذخیره...


cmd.CommandText = "insert into sound (wav) values(@wav)";
cmd.Connection = conn;
byte[] buffer = File.ReadAllBytes(@"\rad.wav");
cmd.Parameters.Add("@wav", SqlDbType.Image).Value = buffer;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();


بازیابی.....


[System.Runtime.InteropServices.DllImport("winmm.dll")]
public static extern long PlaySound(byte[] data, IntPtr hMode, int dwFlag);
private void button2_Click(object sender, EventArgs e)
{
cmd.CommandText = "select wav from sound where id = '1'";
cmd.Connection = conn;
SqlDataReader reader = null;
byte[] wav = null;
conn.Open();
reader = cmd.ExecuteReader();
if (reader.Read())
{
wav = (byte[])reader.GetValue(0);
PlaySound(wav, IntPtr.Zero, 1 | 4);
}
conn.Close();

Sajjad.Aghapour
جمعه 14 تیر 1387, 22:11 عصر
آقا یه سوال فنی دیگه.....
همان طور که در کد بالا می بینید با استفاده از winmm.dll صوتم رو بخش می کنم.حالا اگه بخوام یک WMPlayer به پروژم اضافه کنم تا کابر بتونه Visualization مدیاپلیر رو مشاهده کنه باید چه کار کرد؟!!!....

Sajjad.Aghapour
شنبه 15 تیر 1387, 19:17 عصر
کسی از دوستان ایده ای نداره؟..........

pesare_ariyayi
سه شنبه 01 مرداد 1387, 09:43 صبح
سلام:تشویق:
----یه مقدمه اول (در مورد بهینه ترین روش ذخیره سازی دیتا):اشتباه:

یه روایتی هست که می گه اگه سایز فایلهاتون کوچیک بود (مثل عکسها اون هم نه با رزولوشن بالا و صوت ها و ویدیو های چند ثانیه ای) اونها رو تو database ذخیره کنید. اما اگه سایز زیادی داشتن اونها رو (تو پروژه های نت) تو سرور آپلود کنید و مسیرشون رو تو database ذخیره کنید

** این مثال برای فایلهای ویدئو آورده شده اما شما میتونین به همین طریق و با استفاده از همین type های فیلدهای database اون رو برای فایلهای صوتی استفاده کنید

**کدها به زبان C#.net نوشته شده اند و برای sql server 2005

**


using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
namespaceهایی هستن که باید به پروژتون اضافه بشن
** این مثال برای پروژه های وب هست. اگه می خواین برای pc بنویسید با یه خورده دستکاری همچی رو براه میشه

--- فیلدهای مورد نیاز::متفکر:
[LEFT]field name type

[LEFT]ID int

video varbinary(MAX)
Video_Name nvarchar(50)
Video_Size bigint
[RIGHT]--- استفاده از کد:کف:
آپلود کردن فایل در این کد برای اینه که اون رو به نوع bytes تبدیل کنیم. این کار رو توسط کلاس HTTPPostedFile انجام می دیم سپس تو یک فیلد در database از نوع varbinary قرار می دیم.

[LEFT]

using System.IO;
using System.Data.SqlClient;

public partial class UploadVideo : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{

}
byte[] buffer;//this is the array of bytes which will hold the data (file)

SqlConnection connection;
protected void ButtonUpload_Click(object sender, EventArgs e)
{
//check the file

if (FileUpload1.HasFile && FileUpload1.PostedFile != null && FileUpload1.PostedFile.FileName != "")
{
HttpPostedFile file = FileUpload1.PostedFile;//retrieve the HttpPostedFile object

buffer = new byte[file.ContentLength];
int bytesReaded = file.InputStream.Read(buffer, 0, FileUpload1.PostedFile.ContentLength);
//the HttpPostedFile has InputStream porperty (using System.IO;)

//which can read the stream to the buffer object,

//the first parameter is the array of bytes to store in,

//the second parameter is the zero index (of specific byte) where to start storing in the buffer,

//the third parameter is the number of bytes you want to read (do u care about this?)

if (bytesReaded > 0)
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["uploadConnectionString"].ConnectionString;
connection = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand
("INSERT INTO Videos (Video, Video_Name, Video_Size) VALUES (@video, @videoName, @videoSize)", connection);
cmd.Parameters.Add("@video", SqlDbType.VarBinary, buffer.Length).Value = buffer;
cmd.Parameters.Add("@videoName", SqlDbType.NVarChar).Value = FileUpload1.FileName;
cmd.Parameters.Add("@videoSize", SqlDbType.BigInt).Value = file.ContentLength;
using (connection)
{
connection.Open();
int i = cmd.ExecuteNonQuery();
Label1.Text = "uploaded, " + i.ToString() + " rows affected";
}
}
catch (Exception ex)
{
Label1.Text = ex.Message.ToString();
}
}

}
else
{
Label1.Text = "Choose a valid video file";
}
}
}
//create a sqlcommand object passing the query and the sqlconnection object

//when declaring the parameters you have to be sure u have set the type of video column to varbinary(MAX)

[RIGHT]--- حالا چطوری فایل رو تو player پخش کنیم؟!:عصبانی++:

مشکل اینجاست که تو player باید propertry ی src رو رو فایل تنظیم کنیم در حالی که ما جز یک متغیر از نوع bytes چیز دیگه یی نداریم!!! از 1 handler استفاده می کنیم :چشمک:
[LEFT]

using System;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;

public class VideoHandler : IHttpHandler
{

public void ProcessRequest (HttpContext context)
{
string connectionString = ConfigurationManager.ConnectionStrings["uploadConnectionString"].ConnectionString;

SqlConnection connection = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT Video, Video_Name FROM Videos WHERE ID = @id", connection);
cmd.Parameters.Add("@id", SqlDbType.Int).Value = context.Request.QueryString["id"];
try
{
connection.Open();
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);
if (reader.HasRows)
{
while (reader.Read())
{
context.Response.ContentType = reader["Video_Name"].ToString();
context.Response.BinaryWrite((byte[])reader["Video"]);
}
}
}
finally
{
connection.Close();
}
}

public bool IsReusable
{
get {
return false;
}
}

}
[RIGHT]همونطور که می بینید یک متغیر از نوع HttpContext داریم که توسط کلاس SqlDataReader متغیر bytes رو تو خودش می نویسه

حالا واسه پخش فایل باید از یک کنترل asp.net استفاده کنیم انجا از کنترل Repeter استفاده شده. با یک sql server, sql adapter رو می خونیم datasource رو با کنترل bind, Repeter می کنیم. اینجا میتونین انتخاب کنین که کدوم صوت یا ویدئوی database انتخاب بشه

[LEFT]

private DataTable GetSpecificVideo(object i)//pass the id of the video

{
string connectionString = ConfigurationManager.ConnectionStrings["uploadConnectionString"].ConnectionString;
SqlDataAdapter adapter = new SqlDataAdapter("SELECT Video, ID FROM Videos WHERE ID = @id", connectionString);
adapter.SelectCommand.Parameters.Add("@id", SqlDbType.Int).Value = (int)i;
DataTable table = new DataTable();
adapter.Fill(table);
return table;
}
protected void ButtonShowVideo_Click(object sender, EventArgs e)
{
Repeater1.DataSource = GetSpecificVideo(2);//the video id (2 is example)

Repeater1.DataBind();
}
[RIGHT]
حالا وقت player هستش
به property ی url مقدار <'%# "VideoHandler.ashx?id=" + Eval("ID") %'> رو میدیم, مقدار ID همون اسم سطون IDی Datasourceای هست که repeater به اون Bind شده.

[LEFT]

<asp:Button ID="ButtonShowVideo" runat="server" onclick="ButtonShowVideo_Click"
Text="Show Video" />

/>
<asp:Repeater ID="Repeater1" runat="server">

<object id="player" classid="clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6"
height="170" width="300">
name="url" value='<%# "VideoHandler.ashx?id=" + Eval("ID") %>'/> name="showcontrols" value="true" /> name="autostart" value="true" /> </object> </asp:Repeater>
[RIGHT]هوفف. از مدیرا خواهش می کنم که یه کاری کنن که زبان انگلیسی با پرانتز و ویرگول فارسی کنار بیاد.
و اینکه من نتونستم تگی برای کد های .net پیدا کنم. لطفاً اگه میدونید چطوریه با پیام خصوصی بهم بگید

top7news
سه شنبه 01 مرداد 1387, 22:46 عصر
سلام سجاد جان البته من فقط یه نظر کوچیک میدم ، بهتر بجای نوع داده ای image از نوع var binary استفاده کنی .

Sajjad.Aghapour
سه شنبه 01 مرداد 1387, 23:18 عصر
نه مشکل من ذخیره کردن نیست.مشکل من ربط دادن فایل صوتی که در بانک ذخیره کردم به مدیا پلیری هست که به فرمم اضافه کردم.یعنی می خوام Visualization اون رو به نمایش در بیارم...
البته می تونم صوت موجود در بانک رو یه جا ذخیره کنم و url اون رو به مدیا پلیر بدم .....دوست خوبمون pesare aryiaye هم گفتن صوت رو یه جا ذخیره کنم و ادرسش رو در بانک ذخیره کنم.ولی این حالت به کار من نمی یاد...

3411338M
پنج شنبه 08 مرداد 1388, 12:01 عصر
سلام
برای select کردن فایل صوتی از پایگاهم مشکل دارم
مشکل من اینه که من می خوام در دستور select در قسمت where شرط بذارم تا یک فایل خاص برایم پیدا شود ولی error می ده
چکار کنم؟

mn_zandy63
شنبه 10 مرداد 1388, 02:53 صبح
دستور SELECT ت رو بنویس اینجا ببینیم.

3411338M
شنبه 10 مرداد 1388, 11:07 صبح
string gh = "d:\\tt.wma";
byte[] dddd = File.ReadAllBytes(@gh);
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\database1.mdf;Integrated Security=True;User Instance=True");
SqlCommand com = new SqlCommand(@"select flvoice from tblvoice where tblvoice.flvoice=" + dddd , con);

3411338M
شنبه 10 مرداد 1388, 11:10 صبح
این خطا رو روی خط
SqlDataReader dr = com.ExecuteReader بهم می ده:
An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Add a name or single space as the alias name.
Incorrect syntax near ''.

mn_zandy63
شنبه 10 مرداد 1388, 13:29 عصر
شما محتوای فایل رو میخواهید توی دیتابیس جستجو کنید؟؟؟
نگفتید نام فایل رو میخواید search کنید؟

فکر نکنم مقدار باینری رو بتونید به این شکل که نوشتید جستجو کنید. در این صورت فکر میکنم اگه از دستور select با پارامتر استفاده کنید مشکلتون حل شه.

3411338M
سه شنبه 13 مرداد 1388, 15:33 عصر
چجوری می تونم نام فایل رو search کنم؟
می شه یه نمونه کد بذارید؟

mn_zandy63
چهارشنبه 14 مرداد 1388, 00:30 صبح
خب موقعه ذخیره کردن اطلاعات در دیتابیس٬ اسم فایل رو هم بگیر و توی یه فیلد کنارش ذخیره کن. مثلا از نوع nvarchar به اسم filename.
همین٬ وقتی میخوای جستجو کنی روی اون جستجو کن.

3411338M
پنج شنبه 15 مرداد 1388, 11:52 صبح
این کارو خودمم کردم ولی error بهم می ده
این error :
invalid column name tt
tt اسم فایلمه که توی دیتا بیس ذخیره کردم
دلیل خطاش چی می تونه باشه؟
می شه یه نمونه کد برام بذارید؟

3411338M
پنج شنبه 15 مرداد 1388, 11:58 صبح
ببخشید tt اسم فیلدمه

mn_zandy63
پنج شنبه 15 مرداد 1388, 21:32 عصر
Query ت رو بزار اینجا ببینیم.

3411338M
شنبه 17 مرداد 1388, 07:23 صبح
sqlconnection1.Open();
strsql = "select ahang,esm from pm where esm="+invoice ;
SqlCommand com = new SqlCommand(strsql, sqlconnection1 );
SqlDataReader dr = com.ExecuteReader();
dt.Load(dr);
dr.Close();
sqlconnection1.Close();
byte[] stream = (byte[])dt.Rows[0][0];
File.WriteAllBytes("d:\\news.wma", stream);
MessageBox.Show("play");