vb, sql server, ו t-sql סורר...

זהר פלד

New member
vb, sql server, ו t-sql סורר...

במסגרת המאמצים לבנות אפליקציה שתבצע archive, נתקלתי בבעיה מוזרה קצת: אני מייצר ב vb סט של משפטי t-sql שמשתמשים ב cursor ובלולאה ובעוד כמה דברים, כדי לעדכן\להוסיף רשומות בשרת ה archive לפי הרשומות בשרת ה production (כרגע מדובר על שני מסדי נתונים שיושבים על אותו שרת, אבל זה פחות רלוונטי) הבעיה היא, שה t-sql מחזיר לי שגיאה כאשר אני מריץ אותו מתוך ה vb, אבל כאשר אני מדפיס אותו ב debug.print, ומעתיק אותו ל queryAnalizer, הוא עובד חלק. מה יכול לגרום להבדל הזה, ויותר חשוב, איך אני מתקן את המצב?
 

א ו ר ח ת

New member
לא אותו מנוע מריץ את השאילתות

תראה אם הסינטקס נכון כמו % במקום כוכבית.
 

זהר פלד

New member
אבל אבל אבל...

אם הסינטקס היה שגוי גם ה query analyzer לא היה מריץ אותו, לא? וחוצמזה אין לי שם שום כוכביות ושום אחוזים, רק cursor שרץ על שליפה ממסד נתונים שונה, ריצה על הערכים שלו, ועדכון או הוספה של הערכים בהתאם... מה גם שהספקתי לבצע עוד בדיקה או שתיים - יצרתי sp עם ה t-sql והרצתי אותו דרך ה vb - וזה עבד. אבל כשניסיתי לעשות את היצירה של ה sp עצמו מתוך ה vb, קיבלתי error. והדבר הכי מוזר - כשניסיתי להריץ את ה t-sql סתם כסט של שאילתות שנשלח מה vb למסד, לא קיבלתי שום שגיאה, אבל שום טבלה לא קיבלה יותר מ 70 רשומות, גם טבלאות שהמקור שלהן מכיל 140 רשומות וגם כאלו שהמקור מכיל אלפי רשומות. רק הטבלאות הקטנות יותר מ 70 רשומות התמלאו בהצלחה.
 

גרי רשף

New member
מקווה שכבודו לא יעלב אבל..

..יכול לבוא מישהו ולומר כך: ב-QA אני כותב Select * From MyTable ומקבל רשימה ארוכה, באמצע קוד VB כתבתי Select * From MyTable וקיבלתי הודעת שגיאה.. קורה שיש מישהו שלא יודע שצריך ליצור Connection ולהשתמש בו בדרך מסויימת להרצת פקודת ה-SQL מתוך ה-VB. אנחנו משתדלים לעזור, וראוי שמי ששואל יבהיר מה הוא יודע ומה לא, מה הוא עשה, האם זו שאלה למומחים או למי שמתמצא בנושא, האם השואל מקצוען או מתחיל שזו לו תוכניתו הראשונה..
 

זהר פלד

New member
חס וחלילה, לא נעלב...

יש כמובן אובייקט adodb.connection, והוא פתוח ומחובר למסד הנתונים הנכון (ע"י שימוש ב connectionString ולא ב dsn, אם זה משנה, ה driver שאני משתמש בו :{ Driver={SQL Server), והנה גם דוגמא של ה t-sql:
DECLARE @Team_ID [int],@Team_Name [nvarchar] (50) DECLARE ArchiveCursor CURSOR FOR SELECT Team_ID,Team_Name FROM newApp_dev.dbo.Teams ORDER BY Team_ID OPEN ArchiveCursor FETCH NEXT FROM ArchiveCursor INTO @Team_ID, @Team_Name WHILE @@FETCH_STATUS = 0 BEGIN IF EXISTS(SELECT Team_ID FROM Teams WHERE Team_ID = @Team_ID) BEGIN UPDATE Teams SET Team_Name = @Team_Name WHERE Team_ID = @Team_ID END ELSE BEGIN SET IDENTITY_INSERT Teams ON INSERT INTO Teams(Team_ID,Team_Name) VALUES (@Team_ID, @Team_Name) SET IDENTITY_INSERT Teams OFF END FETCH NEXT FROM ArchiveCursor INTO @Team_ID, @Team_Name END​
השגיאה שקיבלתי כאשר ניסיתי ליצור את הקוד כ sp מתוך ה vb היתה שגיאת SQL:
Syntax error near 'ArchiveCursor'​
אני מקווה שעכשיו זה מפורט מספיק...
 

גרי רשף

New member
ואיך הרצת את זה מתוך ה-VB?

יצרת ב-VB משתנה String, שירשרת אליו את כל הפקודות עם מעברי שורה (Char(13 בין שורה לשורה, וביצעת הכל במכה אחת על ידי Cn.Execute או משהו כזה?
 

גרי רשף

New member
וניסית להריץ את הערך שהמשתנה קיבל בזמן ריצה?

נניח- לדבג, למצוא את הערך של המשתנה תוך כדי ריצה, להעתיק ל-QA, ושם להריץ? אני שואל כי זה מעורר חשד ששכחת איזה מעבר שורה, או אולי רווח של תו שגרם לשתי מילים להתחבר לאחת..
 

זהר פלד

New member
אכן, ניסיתי.

הדפסתי ב debug.print והעתקתי ל qa - עבד כמו גדול. בסופו של דבר עשיתי משהו שאני עדיין מעדיף להמנע ממנו - הדפסתי את כל ה t-sql (כולל יצירה של sp לכל טבלה) לתוך קובץ טקסט, הדבקתי את התוכן שלו ל qa, והרצתי. למעשה, זה יצר לי sp לכל טבלה, ועכשיו ב vb אני פשוט כותב דבר כזה:
oCon.execute "exec stp_archive_"& Tables(i).sName​
(כאשר tables הוא מערך של types שמכיל מידע על הטבלאות) והכל עובד כמו שצריך. עם זאת, הייתי מעדיף שה sql יווצר דינאמית תוך כדי ריצה של ה vb.
 

GeForce 5

New member
אבל למה cursor....?

לא יודע אם זה יפתור את בעיית ההרצה מה-vb, אבל רצוי לבצע פעולות באופן bulkי, לדוגמא:
UPDATE Teams SET Team_Name = NT.Team_Name FROM Teams T INNER JOIN newApp_dev.dbo.Teams NT ON T.Team_ID = NT.Team_ID SET IDENTITY_INSERT Teams ON INSERT INTO Teams (Team_ID,Team_Name) SELECT NT.Team_ID, NT.Team_Name FROM newApp_dev.dbo.Teams NT WHERE NOT EXISTS ( SELECT * FROM Teams WHERE Team_ID = NT.TeamID ) SET IDENTITY_INSERT Teams OFF​
 

זהר פלד

New member
זה באמת נראה הרבה יותר טוב ../images/Emo13.gif

ידעתי שיש פתרון sql טוב יותר ממה שחשבתי עליו, אבל עם הדד-ליין והבעיות שכבר נתקלתי בהן לא הצלחתי לחשוב עליו לבד.... תודה רבה. אני אנסה את ה sql הזה ואדווח
 
למעלה