PDA

View Full Version : اجری یک query جهت ایجاد یک دیتابیس کامل



ezamnejad
دوشنبه 01 مهر 1387, 07:37 صبح
سلام
من یک دیتابیس دارم که شامل تعدادی جدول و sp است . یا استفاده از ابزار generate script ان را به script تبدیل کردم و حالا میخواهم درون برنامه این اسکریپتها را اجرا کنم تا جدوال و sp ها درون دیتابیس انتخاب شده ایجاد شوند .
من از sqlcommand برای این کار استفاده کردم ولی به پیغام خطای زیر مواجه میشم
Incorrect syntax near 'GO

mskarimi
دوشنبه 01 مهر 1387, 10:53 صبح
سلام . منم اين مورد رومي خوام.
هم براي win app و هم براي web app

razavi_university
دوشنبه 01 مهر 1387, 10:54 صبح
لطفا Script رو اینجا قرار بدید

mskarimi
دوشنبه 01 مهر 1387, 11:00 صبح
خيلي ممنون از پاسخ سريع شما
فرض كنين


CREATE DATABASE TestDB
GO
USE TestDB
GO
create table Student(
id int identity(1,1) primary key,
fName nvarchar(30),
lName nvarchar(30))
GO
INSERT Student SELECT 'Ali','Musavi'
INSERT Student SELECT 'Mohsen','Ahmadi'
INSERT Student SELECT 'Bita','Tehrani'
INSERT Student SELECT 'Azita','Noori'
GO

Create Procedure sp_Student_Insert
@fName nvarchar(30),
@lName nvarchar(30)
As
Begin
Insert Into Student
(fName,lName)
Values
(@fName,@lName)
Declare @ReferenceID int
Select @ReferenceID = @@IDENTITY
Return @ReferenceID
End
GO

Create Procedure sp_Student_Update
@id int,
@fName nvarchar(30),
@lName nvarchar(30)
As
Begin
Update Student
Set
fName = @fName,
lName = @lName
Where
id = @id
End
GO

Create Procedure sp_Student_SelectAll
As
Begin
Select
id,
fName,
lName
From Student
End
GO

Create Procedure sp_Student_SelectRow
@id int
As
Begin
Select
id,
fName,
lName
From Student
Where
id = @id
End
GO

Create Procedure sp_Student_DeleteRow
@id int
As
Begin
Delete Student
Where
id = @id
End
GO

علیرضا مداح
دوشنبه 01 مهر 1387, 11:42 صبح
سلام دوست عزیز،
در ADO.Net نمیتوانید از GO استفاده نمایید ، چون اصولا" GO جزو کلیدواژه های SQL نیست و تنها فرمانی (Command) است که پایان یک Batch از دستورات T-SQL زا معین میکند ، برای رفع این مشکل شما باید اسکریپت خود را بر اساس فرمان GO به Batch های مجزا تبدیل کنید ، برای اینکار میتوانید از متد String.Split استفاده نمایید که توصیه نمیشود ، به دلیل اینکه ممکن است در نام یکی از آبجکت های موجود در اسکریپت واژه "GO" به کار رفته باشد و در نتیجه نتایج اشتباه حاصل خواهد شد ، بدینمنظور استفاده از Regular Expressions جهت تفکیک دستورات بر اساس فرمان GO راه حل پیشنهادی میباشد ،/
یک نمونه کد اصلاح شده با بهره گیری از کلاس Regex :


private static void ExecuteSql(SqlConnection sqlCon)
{
string[] SqlLine;
Regex regex = new Regex("^GO?", RegexOptions.IgnoreCase | RegexOptions.Multiline);
string txtSQL = GetScript("Install.sql");
SqlLine = regex.Split(txtSQL);
SqlCommand cmd = sqlCon.CreateCommand();
cmd.Connection = sqlCon;

foreach (string line in SqlLine)
{
if (line.Length > 0)
{
cmd.CommandText = line;
cmd.CommandType = CommandType.Text;
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//rollback
ExecuteDrop(sqlCon);
break;
}
}
}
}

منبع : http://www.codeproject.com/KB/install/sqlscriptinstall.aspx

مسلما" هر چه Regular Expression دقیقتر باشد ، نتایج قابل اطمینان تری حاصل میشود ،/