PDA

View Full Version : سوال: اشكال در اجراي كوئري از طريق سي شارپ



Programmer 1
دوشنبه 11 بهمن 1389, 06:21 صبح
سلام ،

من يك فايل database.sql دارم كه كوئري من داخل اون قرار داره ، اول چك ميكنه كه بانك وجود داره يا نه اگر وجود نداشت اون رو ايجاد ميكنه و بعدش يك سري جدول و پروسيجر ايجاد ميكنه ، من وقتي اين كوئري را از داخل query analyzer اجرا مينم بدون هيچ مشكلي اجرا ميشه ولي وقتي همين فايل كوئري رو از داخل سي شارپ اجرا ميكنم خطا ميده نمي دونم ، خطاش هم يه خطاي گنگه ، ميگه فلان جا نزديك دستور GO اشتباهي وجود داره اگه وجود داشت چرا اونجا اجرا ميشد! ، دليلش چيه لطفا راهنمايي كنيد؟

ضمنا از sql server 2000 و VS2008 استفاده ميكنم.
منتظر پاسخ شما دوستان عزيز هستم .

با تشكر/.

Programmer 1
سه شنبه 12 بهمن 1389, 07:48 صبح
دوستان كارم گيره يكي جواب بده لطفا

davoodrm666_666
سه شنبه 12 بهمن 1389, 08:01 صبح
اگه از sqlcommand استفاده مي كني
1 - كلمه Go رو حذف كن
2 - دستورت رو چند قسمت كن و تيكه تيكه اجرا كن ( داخل يك transaction)

Programmer 1
چهارشنبه 13 بهمن 1389, 06:39 صبح
اگه از sqlcommand استفاده مي كني
1 - كلمه Go رو حذف كن
2 - دستورت رو چند قسمت كن و تيكه تيكه اجرا كن ( داخل يك transaction)

دوست عزيز ممنونم ولي اگه Go رو حذف كنم كه نميشه چون مثلا اگه بعد از دوستورات مربوط به ايجاد بانك GO نزاريم و مستقيما بريم چند تا جدول تو بانكي كه هنوز ايجاد نشده ايجاد كنيم خطا رخ ميده چون بايد بعد از دستورات ايجاد بانك Go رو بزاريم تا Sql Server به صورت تيكه تيكه كد رو پارز كنه ،

ميشه بگيد به چه صورت دستور رو تكه تكه كنم؟ يكم بيشتر توضيح بديد ، زياد Sql كار نكردم

منتظر جواب شما هستم

با تشكر/.

Programmer 1
یک شنبه 17 بهمن 1389, 06:56 صبح
لطفا یک نفر مرتب توضیح بده من مشکلم هنوز رفع نشده

peymanjon
یک شنبه 17 بهمن 1389, 07:46 صبح
خطاش هم يه خطاي گنگه ، ميگه فلان جا نزديك دستور GO اشتباهي وجود داره اگه وجود داشت چرا اونجا اجرا ميشد!
دوست عزیز انتظار داری با این نوع سوال جواب هم بگیرید؟
شما باید کدهاتون یا حداقل متن خطا را بگذارید تا بتونیم راهنماییتون کنیم.
موفق باشید

Programmer 1
جمعه 29 بهمن 1389, 07:05 صبح
دوستان مشکل رو دقیقا فهمیدم کجاست ولی هنوز راه حلی برای رفعش پیدا نکردم . من در محتوای فایل کوئری رو با دستور File.ReadAllText داخل یک متغیر رشته ای ذخیره کردم مشکل دقیقا همینجاست که تابع ReadAllText حتی فواصل خالی و کاراکترهای تب و CR رو هم در متغیر رشته ای قرار میده من اومدم اون کاراکترهای اضافی رو با فضای خالی Replace کردم ولی باز مشکل دیگه ای ظاهر شد اینه که کاراکترهای فارسی رو به کاراکترهای نامفهوم تبدیل میکنه الان سوالم اینه که :

1- چه جوری میتونم محتوای یک فایل متنی رو بخونم بدون اینکه کاراکترهای کنترلی در نظر گرفته بشن
2- چه جوری کاراکترهای فارسی رو به درستی بخونم

دوستان دیگه الان سوال دقیقه خواهشا جواب بدید

Reza_Yarahmadi
جمعه 29 بهمن 1389, 10:36 صبح
دوست عزیز کلمه GO در خود SQL Server وفقط برای تفکیک Transaction ها مورد استفاده قرار میگیره و چون دستور شما در یک Tranaction اجرا میشه به اون دستور ایراد میگیره.
برای رفعش چندین راه حل وجود داره ، یکیشون بصورت زیر:
فرض کنید دستوری مثل دستور زیر رو میخواید انجام بدید

CREATE TABLE tbl(
[ID] [int] NULL,
[Name] [nvarchar](50) NULL
)

GO

CREATE PROCEDURE SP
@id int
AS
BEGIN
Select * From tbl Where Id = @Id
END
در صورت اجرای این دستورات در SQL Server مشکلی نیست و اجرا میشه ولی به همین صورت در برنامه با همون خطا مواجه میشه.
ولی در صورتی که دستور رو بصورت زیر تغییر بدید در هر 2 حالت بدون مشکل اجرا میشه.

EXEC SP_EXECUTESQL @Statement = N'CREATE TABLE tbl(
[ID] [int] NULL,
[Name] [nvarchar](50) NULL
)
'
EXEC SP_EXECUTESQL @Statement = N'CREATE PROCEDURE sp
@id int
AS
BEGIN
Select * From tbl Where Id = @Id
END
'

1- چه جوری میتونم محتوای یک فایل متنی رو بخونم بدون اینکه کاراکترهای کنترلی در نظر گرفته بشن
نیازی نیست شما کاری انجام بدید SQL Server خودش اونها رو حذف میکنه.

2- چه جوری کاراکترهای فارسی رو به درستی بخونم
در دستور خوندن از فایل Encoding مورد استفاده رو به Default بدید ، در صورت جواب ندادن سایر Encoding ها رو امتحان کنید.

File.ReadAllText("File Path", Encoding.Default);

Programmer 1
یک شنبه 01 اسفند 1389, 01:46 صبح
اول اینکه بسیار سپاسگذارم بابت راهنماییتان ، فقط یک مشکل باقی مونده ، من طبق چیزی که شما فرمودید Go ها را برداشتم و از همون پروسیجری که گفتید استفاده کردم ولی در مواردی مانند زیر Query Analyzer خطای میده چون متن بین 'N و ' شامل یک single Quate دیگه همه هست البته با دستور Go هیچ خطایی صادر نمیشه و درست اجرا میشه ، لطفا راهنمایی کنید:


کد حامل خطا:



EXEC SP_EXECUTESQL @Statement = N'
IF (
SELECT COUNT(*)
FROM sysdatabases
WHERE [name] = 'OmorEdari'
) = 0
CREATE DATABASE OmorEdari
'

متن پیغام خطا:
Line 9: Incorrect syntax near 'OmorEdari'.

و یک سوال دیگه داشتم ، من برای اینکه قبل از اجرای نرم افزار، بانک اطلاعاتی و جداول و پروسیجرها ایجاد بشن اومدم یک کوئری نوشتم که بانک اطلاعاتی و جداول و پروسیجرها رو خودش ایجاد میکنه و برای اجرا شدن این فایل ، قبل از هر بار نمایش فرم لاگین نرم افزار ، این فایل اجرا میشه ، داخل خود این فایل بررسی میشه اگر مثلا دیتابیس وجود داشت دیتابیسی ایجاد نشه (همون کد بالایی که خطا هم داره ) ، حالا سوال من اینه که آیا روشی وجود نداره که در حین نصب بانک اطلاعاتی و جداول و ... ایجاد بشن تا دیگه با هربار اجرای برنامه پردازش اضافی انجام نشه (و مهمتر اینکه من از این دردسر راحت بشم ! ) ، فقط install Shild رو پیشنهاد ندید چون خیلی مشکل داره امتحانش کردم! ؟

راستی نمیدونم مشکل از سیستم منه یا فونتی که شما انتخاب کردید ، کد داخل تکست باکسی که قرار دادید ناخواناست مجبور شدم کپی کنم تو notepad

با سپاس /.

Reza_Yarahmadi
یک شنبه 01 اسفند 1389, 08:04 صبح
متن بین 'N و ' شامل یک single Quate دیگه همه هست البته با دستور Go هیچ خطایی صادر نمیشه و درست اجرا میشه
of دوست عزيز شما دستورات خودتونرو در قالب يك رشته اجرا ميكنيد بايد اين رشته رو طوري تغيير بديد كه توي رشته شما تك كتيشن وجود داشته باشه ، يعني بصورت زير

EXEC SP_EXECUTESQL @Statement = N'
IF (
SELECT COUNT(*)
FROM sysdatabases
WHERE [name] = ''OmorEdari''
) = 0
CREATE DATABASE OmorEdari
'

حالا سوال من اینه که آیا روشی وجود نداره که در حین نصب بانک اطلاعاتی و جداول و ... ایجاد بشن تا دیگه با هربار اجرای برنامه پردازش اضافی انجام نشه (و مهمتر اینکه من از این دردسر راحت بشم ! ) ، فقط install Shild رو پیشنهاد ندید چون خیلی مشکل داره امتحانش کردم! ؟
يك راه حل ميتونه اين باشه:
يك برنامه كوچيك بنويسيد كه كارش فقط درست كردن ساختار ديتابيس باشه (اجراي اسكريژت تهيه شده) بعد توي ستاپي كه با VS‌ميسازيد ،‌از پنجره Solution روي گزينه Custom Actions Editor كليك كنيد و فايل برنامه كوچيك رو به پوشه Commit اضافه كنيد. توي اين حالت پس از نصب برنامه فايل معرفي شده شما اجرا و ديتابيستون ساخته ميشه (بهتر اينه كه برنامه كوچيك در قالب يك Console Application باشه)


راستی نمیدونم مشکل از سیستم منه یا فونتی که شما انتخاب کردید ، کد داخل تکست باکسی که قرار دادید ناخواناست مجبور شدم کپی کنم تو notepad
منم نميدونم مشكل ازكجاست چون من فونت خاصي رو انتخاب نميكنم و از فونت پيش فرض اديتور سايت (Tahoma) استفاده ميكنم.

Programmer 1
دوشنبه 02 اسفند 1389, 01:25 صبح
باز هم به خاطر وقتی که برای پاسخ دادن به سوالات بنده صرف میکنید نهایت تشکر را دارم ، با عرض معذرت باز یک مشکل دیگه پیش اومد ، کد زیر را ملاحظه بفرمایید :



EXEC SP_EXECUTESQL @Statement = N'
USE MASTER
'


EXEC SP_EXECUTESQL @Statement = N'
IF (
SELECT COUNT(*)
FROM sysdatabases
WHERE [name] = ''OmorEdari''
) = 0
CREATE DATABASE OmorEdari
'


EXEC SP_EXECUTESQL @Statement = N'
USE OmorEdari
'


EXEC SP_EXECUTESQL @Statement = N'
IF (
NOT EXISTS
(
SELECT *
FROM sysobjects
WHERE [name] = ''tblPersons''
)
)
CREATE TABLE tblPersons
(
[ID] INT NOT NULL PRIMARY KEY,
[Name] NVARCHAR(70) NOT NULL
/* Other Fields */
)
'

هیچ خطایی صادر نمیشه ، بانک ایجاد میشه ولی بر خلاف انتظار هیچ جدولی ایجاد نمیشه به نظرتون مشکل کجاست؟ :متفکر:

با سپاس فراوان /.

Reza_Yarahmadi
دوشنبه 02 اسفند 1389, 11:38 صبح
بانک ایجاد میشه ولی بر خلاف انتظار هیچ جدولی ایجاد نمیشه به نظرتون مشکل کجاست؟
جدول ایجاد میشه ولی توی دستابیس Master ساخته میشه. در استفاده از این روش باید دقت داشته باشید که هر EXEC در یک Transaction انجام میشه و در ضمن نیازی نیست همه دستورات رو بصورت رشته ای اجرا کنید.
میتونید بصورت زیر تغییرش بدید.

IF (
SELECT COUNT(*)
FROM sysdatabases
WHERE [name] = 'OmorEdari'
) = 0
BEGIN
EXEC SP_EXECUTESQL @Statement = N'
USE MASTER
CREATE DATABASE OmorEdari
'
EXEC SP_EXECUTESQL @Statement = N'
USE OmorEdari
CREATE TABLE tblPersons
(
[ID] INT NOT NULL PRIMARY KEY,
[Name] NVARCHAR(70) NOT NULL
/* Other Fields */
)
'
END

Programmer 1
دوشنبه 02 اسفند 1389, 23:15 عصر
سلام ، با تشکر از پاسختان مثل اینکه این SQL قصد نداره دست از سر ما بر داره ، چقدر دردسر داره! در پست بالایی که شما فرمودید اگه به جای جدول یک پروسیجر بخوایم درست کنیم با خطا مواجه میشیم نمیدونم دلیلش چیه ؟ راهنماش رو نگاه کردم یه جایی فقط گفته بود عباراتی مثل : Create Procedure نمیتونن با دیگر جملات در یک Batch ترکیب بشن ،‌ منم طبق همین گفته اومدم و فقط یک پروسیجر در داخل یک Transaction ساختم ولی باز هم خطا صادر شد (جوش آوردم!) :



BEGIN

EXEC SP_EXECUTESQL @Statement = N'

USE OmorEdari
CREATE PROCEDURE select_Mosaedeh
AS
SELECT *
FROM tblMosaedeh
'
END


متن پیغام خطا :

'CREATE PROCEDURE' must be the first statement in a query batch.

لطفا راهنمایی کنید ، من که سردرگم شدم .

Reza_Yarahmadi
سه شنبه 03 اسفند 1389, 07:53 صبح
مشكل از دستور USE OmorEdari شماست. نيازي نيست اين دستور رو در رشته مورد نظرتون بياريد
ميتونيد بصورت زير اين كار رو انجام بديد

USE OmorEdari
EXEC SP_EXECUTESQL @Statement = N'
CREATE PROCEDURE select_Mosaedeh
AS
SELECT *
FROM tblMosaedeh
'