PDA

View Full Version : سوال: backup,restore باstoredprocduer با خطای زیر مواجهه می شه علت چست؟



mohammad kafiyan
جمعه 14 بهمن 1390, 22:04 عصر
با سلام به دوستان برنامه نویس خیلی روی این خطا کار کردم تا مشکل آنرا بر طرف کنم
می خواهم با استفاده از storedprocduer عملیات backup,restore را انجام دهم با استفاده از کد های زیر
procduer ها را تست کردم و خروجی گرفتم ولی توی برنامه وقتی فر خوانی می کنم با پیغام زیر روبرو می شم نمی دونم چرا؟؟؟؟؟؟؟
procduer backup:



ALTER PROCEDURE [dbo].[anbar_backup]
(
@StrFileName nvarchar(50)
)
AS
begin


BACKUP DATABASE [anbar]
TO DISK =@StrFileName
WITH INIT,
NOUNLOAD,
NAME = N'[anbar]',
NOSKIP,
STATS = 10,
NOFORMAT




end
RETURN


فرخوانی procduer از طریق C#‎


public void anbar_backup()
{
SqlCommand cmd = new SqlCommand();
try
{


connect();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = @"anbar_backup";
cmd.Parameters.Add("@StrFileName", SqlDbType.NVarChar).Value = @path_backup_restore;
cmd.CommandType = CommandType.Text;
sd.SelectCommand = cmd;
con.Open();
cmd.ExecuteNonQuery();
con.Close();
cmd.Dispose();
}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
}
}


پیغام خطا :
Proceduer or Function 'anbar_backup' expects parameter '@StrFileName',which was not supplied
:عصبانی++:

zarrinnegar
جمعه 14 بهمن 1390, 23:31 عصر
یک BreakPoint بزار روی خطی که پارامتر رو بهش اختصاص میدی بعد محتویات اون متغیر رو چک کن

parvizwpf
شنبه 15 بهمن 1390, 01:09 صبح
احتمالا باید پارامترتو جور دیگه ای اد کنی. بعضی موقعها به این نوع تعریف پارامتر گیر میده.
اگه ام اس دی ان رو ببینی خوبه.

rainy_day
شنبه 15 بهمن 1390, 14:44 عصر
این خطا میگه که این sp برای متغیر StrFileName @ مقداری رو انتظار داره ،در حالی که مقداری بهش داده نمی شه.
Break point بزن و ببین وقتی به خط
cmd.Parameters.Add("@StrFileName", SqlDbType.NVarChar).Value = path_backup_restore;
می رسه متغیر path_backup_restore مقداری رو داره یا نه.این متغیر چون داره به sp فرستاده میشه نباید NULL باشه.

mohammad kafiyan
شنبه 15 بهمن 1390, 20:53 عصر
سلام به دوستان و با تشکر از راهنمایی دوستان


Break point بزن و ببین وقتی به خط
مقدار دهی انجام می شه داخل متغییر path_backup_restore
و حتی به صورت دستی مقدار دادم به اون ولی باز هم همون خطا


cmd.Parameters.Add("@StrFileName", SqlDbType.NVarChar).Value = "E:\\«Backup anbar»«1390-11-15»«9-10-54 PM».BAK";

کدها را تست کنند ببیند خروجی می گیرند و اگر خروجی گرفتند نحوه ی فرخوانی و نحوه ارسال پارامتر اون را بگویند چگونه است ؟
با تشکر

rainy_day
دوشنبه 17 بهمن 1390, 20:01 عصر
کد ها بررسی شد و نتیجه گرفته شد
store procedure مشکل نداره
ولی فراخوانیت ؟!!!
این رو تست کن. برای من که جواب می ده.
نمونه برنامه رو هم گذاشتم .82123

public void anbar_backup()

{
try
{
string path_backup_restore = @"E:\test.bak";
using (SqlConnection con = new SqlConnection(WindowsFormsApplication1.Properties. Settings.Default.cnn))
{

con.Open();
SqlCommand cmd = con.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "anbar_backup";


cmd.Parameters.Add("@StrFileName", SqlDbType.NVarChar).Value = path_backup_restore;


int result =Convert.ToInt32 ( cmd.ExecuteScalar());
if (result == 0)
{
MessageBox.Show("successful");


}
con.Close();



}
}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
}
}

mohammad kafiyan
دوشنبه 17 بهمن 1390, 23:08 عصر
سلام به دوستان کد procduer مربوط به retsore قرار دادم حال آیا باید این procduer در بانک خودم ایجاد کنم یا باید در بانک master ایجاد کنم توی یکی از سایت این مطلب را خواندم یک کمی سر در گمم
لطفا راهنمایی با تشکر


بازیابینرمافزاري

براي اینکه نرم افزارشما قابلیت بازیابی(Restore) راداشته باشد باید توجه داشته باشیدکه ابتدالازم است کلیهConnection ها به بانک اطلاعاتی نرم افزار را قطع کنیم وسپس ازطریق اتصال به یک دیتابیس دیگر(مثلا master)پروسیجربازیابی را اجراکنیم ودوباره برنامه را اجراکنیم. این درواقع پروسه اي منطقی است،چراکه نمیتوان به یک دیتابیس وصل بود وهمزمان آنرا بازیابی کرد و جامعیت اطلاعات حفظ شود


http://www.itnee.com/Article.aspx#CSharpAndSQLServer

mohammad kafiyan
جمعه 21 بهمن 1390, 00:03 صبح
سلام به دوستان می خواستم ببینم کسی از دوستان store procduer مربوط به retsore نیاز دارم که در کجا این procduer را باید بنویسم آیا این procduer را در بانک خودم ایجاد کنم یا باید در بانک master ایجاد کنم (البته در بانک خودم ایجاد کردم ولی پیغام استفاده از بانک را داد کد مورد نظر را قرار دادم)
اگر در master چگونه باید اون را فراخوانی کنم در c# (نکته اگر sql sever mangment حذف شود این procduer که در master ایجاد شده نیز حذف می شود !!!!؟؟؟؟ )



USE [anbar]
GO
/****** Object: StoredProcedure [dbo].[anbar_restore] Script Date: 02/10/2012 00:22:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[anbar_restore]
(
@strFileName nvarchar(50)
)
AS

ALTER DATABASE [anbar] SET single_user WITH ROLLBACK IMMEDIATE

Restore Database [anbar] From Disk =@strFileName WITH REPLACE , NOUNLOAD , STATS = 10, RECOVERY

ALTER DATABASE [anbar] SET MULTI_USER

RETURN

mohammad kafiyan
جمعه 21 بهمن 1390, 23:16 عصر
سلام به دوستان واقعا کسی توضیح و راهنمایی و یا کدی ندارد قرار بده
منتظریم راهنمایی شما هستیم
:متعجب::متعجب::متفکر::ناراحت:

mohammad kafiyan
شنبه 22 بهمن 1390, 11:26 صبح
سلام به دوستان با procduer restore مشکل پیدا کردم
در بانک master این procduer ساختم و execute کردم و به ورودی آن هم آدرس دستی دادم و جواب داد حالا نمی دانم تو برنامه چگونه باید اون procduer را فرخوانی کنم
و آیا باید همین کار را کردو آیا این روش درسته

in_chand_nafar
شنبه 22 بهمن 1390, 15:02 عصر
بهترين راه Backup‌و Restore اين است كه شما يك برنامه جداگانه براي اين كار بنويسيد (بيشتر شركت ها از اين روش استفاده مي كنند)
1- توصيه من براي انجام اين كار اين است كه شما از SP استفاده نكنيد چون بايد SP مربوط به Restore بايد داخل بانك Master قرار دهيد و ...
2- يك برنامه جدا بسازيد كه صرفا به بانك Master وصل ميشه
3- هر موقع Backup لازم داشتيد TSQL مربوط به گرفتن Backup را از داخل برنامه اجرا كنيد
4- هر موقه نياز به Restore داشتيد مي توانيد با اسكريپت مربوط به Single User كليه كاربران را بيرون ريخته و بانك مورد نظر را Restore‌سپس بانك را در حالت MultiUser قرار دهيد

----
براي فراخواني اين SP‌از برنامه مي توانيد
Exec Master.DBO.anbar_restore 'c:\1.bak'
مي توني اين كد را از طريق برنامه اجرا كنيد ExecuteCommand و....

mohammad kafiyan
شنبه 22 بهمن 1390, 17:23 عصر
با سلام تو بعضی از تایپیک ها که سرچ می کردم کد های مربوط به sp backup ,restore را نوشته بودند آیا این دوستان از این روش استفاده نمی کنند (stored procduer)


کجا این procduer را باید بنویسم آیا این procduer را در بانک خودم ایجاد کنم یا باید در بانک master ایجاد کنم (البته در بانک خودم ایجاد کردم ولی پیغام استفاده از بانک را داد کد مورد نظر را قرار دادم)
اگر در master چگونه باید اون را فراخوانی کنم در C#‎ (نکته اگر sql sever mangment حذف شود این procduer که در master ایجاد شده نیز حذف می شود !!!!؟؟؟؟ )

این قسمت را هم یک کمی توضیح دهید

in_chand_nafar
شنبه 22 بهمن 1390, 19:42 عصر
اشاره كردم معمولا براي Restore‌كردن از StoredProcedure استفاده نمي كنند (جواب سوال كجا .....) در اين صورت شما بايد SP خود را در بانك Master و يا در بانكي به غير از بانك خود ايجاد كنيد

command.CommandText = "Exec Master.DBO.anbar_restore 'c:\1.bak'";

بهتر است در يك برنامه جداگانه كدهاي مربوط به bACKUP‌و Restore را بنويسيد
دليل هم اين است كه بايد در زمان Restore‌ كليه كانكشن هاي مربوط به برنامه را قطع كنيد تا بتوانيد اين عمليات (Restore ) را انجام دهيد