עזרה בעבודה מול מסד נתונים יש לי בעיה עם התחברות למסד נתונים, כשהמסד ריק ואין בו שום רשומה האתר עולה וזה לא עושה בעיות אבל שאני שם בו דברים אז הוא רושם לי את השגיאה:
Microsoft JET Database Engine (0x80040E07) Data type mismatch in criteria expression. /index.asp, line 27
הקוד של ההתחברות למסד נתונים:
Dim sql set conn=Server.CreateObject("ADODB.Connection") conn.Provider="Microsoft.Jet.OLEDB.4.0" conn.Open(Server.Mappath("db/data.mdb")) set rs = Server.CreateObject("ADODB.recordset") sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay=2 ORDER BY haour" rs.Open sql, conn
הוא באמת מוגדר כמספר, שיניתי לכמו שאתה רשמת בקוד וזה לא פועל…
הקוד אחרי השינוי:
Dim sql set conn=Server.CreateObject("ADODB.Connection") conn.Provider="Microsoft.Jet.OLEDB.4.0" conn.Open(Server.Mappath("db/data.mdb")) set rs = Server.CreateObject("ADODB.recordset") sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay='"& weekday(date_value) &"' ORDER BY haour" rs.Open sql, conn
הפונקציה weekday מחזירה מספר ואתה שם אותה בתוך גרשים בודדים, צריך להוריד את הגרשיים. אני מציע לך (כדי לפשט את השאילתא) לבצע את הפונציה לפני השאילתא ולהכניס את התוצאה לשאילתא theday=weekday(date_value) sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay="& theday &" ORDER BY haour"
Dim sql set conn=Server.CreateObject("ADODB.Connection") conn.Provider="Microsoft.Jet.OLEDB.4.0" conn.Open(Server.Mappath("db/data.mdb")) set rs = Server.CreateObject("ADODB.recordset") theday=weekday(date_value) sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay="& theday &" ORDER BY haour" rs.Open sql, conn
לצערי הכל נראה לי תקין והגיוני תנסה להוסיף את השורה הבאה לפני השורה rs.Open sql, conn ולבטל את יתר הקוד בדף כדי לראות מה מכיל המשתנה SQL Response.Write sql
קrtתי את כל השירשור מהתחלה שמתי לב שבהודעה השלישית הגדרת את daay כמחרוזת אבל אתה קורא לו כמספר כלומר בלי גרש בודד – או שתגדיר כמחרוזת ותקרא עם גרש או כמספר ותקרא בלי גרש אני מקווה שיעבוד…
'daay as integer sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay="& theday &" ORDER BY haour"
"daay as string sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay='"& theday &"' ORDER BY haour"
מצטער בטעות שלחתי בלי גוף ההודעה הקוד שלי עכשיו להדפיס את את כל הנתונים בטבלה הוא:
Dim x,haour do until rs.EOF%> <tr> <%for each x in rs.Fields %> <td><%Response.Write(x.value)%></td> <%next rs.MoveNext%> </tr> <%loop
עכשיו יש לי פונקציה שמקבלת ערך ומחזירה שעה לפי הערך, אני רוצה לבצע את הפונקציה בשביל ליצור עוד תא בטבלה, הערך נמצא בתוך המסד נתונים והוא הערך הראשון שנקרא. איך אני יכול לגשת אליו?
אכן לא ברור, אבל אם הבנתי נכון אז תוסיף תנאי בלולאה שמזהה את השדה לפי השם שלו. נניח ששם השדה הוא fHour אז צ"ל משהוא כזה Dim x,haour,sTxt do until rs.EOF%> <tr> <%for each x in rs.Fields if x.name=fHour then sTxt=GoFunction() else sTxt=x.value %> <td><%Response.Write(sTxt)%></td> <%next rs.MoveNext%> </tr> <%loop
הבנת נכון אבל זה עדיין לא פועל, או שהשגיאה בקוד שמדפיס או בפונקציה… הקוד:
Dim x,haour,tstart,tend do until rs.EOF%> <tr> <%for each x in rs.Fields if x.name=haour then tstart=startf(x.value) tend=endf(x.value) else%> <td><%Response.Write(x.value)%></td> <%end if next%> <td><%=tstart%></td> <td><%=tend%></td> <%rs.MoveNext%> </tr> <%loop rs.close conn.close %>
הפונקציות tstart ו- tend (אותה פונקציה רק שינוי ערכים)
FUNCTION startf(num) SELECT CASE num CASE "1" num = "7:45" CASE "2" num = "8:35" CASE "3" num = "9:25" CASE "4" num = "10:30" CASE "5" num = "11:20" CASE "6" num = "12:15" CASE "7" num = "1:00" CASE "8" num = "1:50" CASE "9" num = "2:40" END SELECT startf = num END FUNCTION
FUNCTION endf(num) SELECT CASE num CASE "1" num = "8:30" CASE "2" num = "9:20" CASE "3" num = "10:10" CASE "4" num = "11:15" CASE "5" num = "12:05" CASE "6" num = "12:50" CASE "7" num = "1:45" CASE "8" num = "2:30" CASE "9" num = "3:25" END SELECT startf = num END FUNCTION
עידכון רשומה כדי לעדכן רשומה אתה צריך מזהה רשומה – בדוגמא RecId, ב DATA תרשום את שם השדה = ערך חדש, תרשום רק את השדות שאתה רוצה לשנות המשתנה DATA הוא מחרוזת אבל אם אתה רושם מספרים תשים לב לא להכניס אותם לתוך גרש בודד. אם לא תרשום מזהה רשומה כלומר לא תכתוב – where ID="& RecId אז כל הרשומות ישתנו ויקבלו את הערכים החדשים (נוח להשתמש בזה אם אתה רוצה לשנות ערך של שדה מסויים בכל הרשומות שיהיה זהה בכולן) תשנה את שם הטבלה. RecId=1 With Request Data="HebName='"& .Form("text1")&"',EngName='"& .Form("text2")&"',IconName='"& .Form("text3")&"'" End With conn.Execute "update Tabname set "& Data &" where ID="& RecId
אז ככה: אתה צריך קודם כל לשלוף את התוכן של הקובץ בעזרת FSO למחרוזת, ואז על המחרוזת הזו אתה עושה את ההחלפה, ובסוף אתה מחזיר את המחרוזת לקובץ, שוב בעזרת FSO.
26 תשובות
עזרה בעבודה מול מסד נתונים
יש לי בעיה עם התחברות למסד נתונים, כשהמסד ריק ואין בו שום רשומה האתר עולה וזה לא עושה בעיות אבל שאני שם בו דברים אז הוא רושם לי את השגיאה:
Microsoft JET Database Engine (0x80040E07)
Data type mismatch in criteria expression.
/index.asp, line 27
הקוד של ההתחברות למסד נתונים:
Dim sql
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("db/data.mdb"))
set rs = Server.CreateObject("ADODB.recordset")
sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay=2 ORDER BY haour"
rs.Open sql, conn
שורה 27 זאת השורה האחרונה בקוד שהעתקתי לפה…
הגדרת שדות
כנראה שהשדה daay מוגדר כמספר וכאן אתה קורא לו כמחרוזת – או שתשנה את הגדרת השדה למחרוזת או שתקרא לו כמספר כלומר
AND daay=" & 2 & " ORDER BY haour"
הוא באמת מוגדר כמספר, שיניתי
לכמו שאתה רשמת בקוד וזה לא פועל…
הקוד אחרי השינוי:
Dim sql
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("db/data.mdb"))
set rs = Server.CreateObject("ADODB.recordset")
sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay='"& weekday(date_value) &"' ORDER BY haour"
rs.Open sql, conn
הפונקציה weekday מחזירה מספר
ואתה שם אותה בתוך גרשים בודדים, צריך להוריד את הגרשיים. אני מציע לך (כדי לפשט את השאילתא) לבצע את הפונציה לפני השאילתא ולהכניס את התוצאה לשאילתא
theday=weekday(date_value)
sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay="& theday &" ORDER BY haour"
העתקתי ועדיין לא פועל
הקוד המעודכן:
Dim sql
set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open(Server.Mappath("db/data.mdb"))
set rs = Server.CreateObject("ADODB.recordset")
theday=weekday(date_value)
sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay="& theday &" ORDER BY haour"
rs.Open sql, conn
מהי הודעת השגיאה?
הנה
כמו שכתבתי כבר:
Error Type:
Microsoft JET Database Engine (0x80040E07)
Data type mismatch in criteria expression.
/index.asp, line 28
רק שעכשיו השורה שיש לה את הבעיה זה 28 כי הוספתי שורה לפי מה שאמרו פה
לצערי הכל נראה לי תקין והגיוני תנסה
להוסיף את השורה הבאה לפני השורה rs.Open sql, conn
ולבטל את יתר הקוד בדף כדי לראות מה מכיל המשתנה SQL
Response.Write sql
בעיה עם כתיבה לקובץ
כתבתי סקריפט שמוסיף שורה לקובץ, הסקריפט:
<%@language="vbscript" codepage="1255" %>
<%
Dim FSO, File ,text
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile("C:Inetpubwwwrootfilesmessages.txt",8,True,0)
File.WriteLine "hello"
File.Close
Set File = Nothing
Set FSO = Nothing
%>
בהתחלה היו בעיות של הרשאה ותיקנתי אותם ועכשיו זה פועל אבל זה פשוט לא רושם כלום בקובץ… מישהו יודע למה?
תודה מראש,
גיא
מצטער בטעות שירשרתי את ההודעה, נפטר
זאת הייתה בעיה קטנה שלא הפעלתי את הקובץ הזה הקוד תקין
עשיתי הפלט בתוך ההודעה
פלט:
SELECT mikzoa,teacher,haour FROM main WHERE clas='44' AND daay=7 ORDER BY haour
האם השדה haour מוגדר במסד כשדה
תאריך/שעה – אם כן אז חייב להיות בו ערך מתאים , אסור שהשדה יהיה ריק=("")
לא, כמספר
לא.. haour מוגדר כמספר, הערכים שאמורים להיות בו זה 1,2,3,4 ככה עד 9 או משהו כזה זה האפשרויות
קrtתי את כל השירשור מהתחלה שמתי לב
שבהודעה השלישית הגדרת את daay כמחרוזת אבל אתה קורא לו כמספר כלומר בלי גרש בודד – או שתגדיר כמחרוזת ותקרא עם גרש או כמספר ותקרא בלי גרש
אני מקווה שיעבוד…
'daay as integer
sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay="& theday &" ORDER BY haour"
"daay as string
sql="SELECT mikzoa,teacher,haour FROM main WHERE clas='"& clas &"' AND daay='"& theday &"' ORDER BY haour"
תודה רבה! הקוד הנכון דומה למה שנתת
הקוד הנכון:
sql="SELECT haour,mikzoa,teacher FROM main WHERE clas="& clas &" AND daay="& theday &" ORDER BY haour"
קראתי גם ל-clas וגם ל-daay כמספר ועכשיו זה פועל. רעיון שלך תודה רבה!
מצטער בטעות שלחתי בלי גוף ההודעה
הקוד שלי עכשיו להדפיס את את כל הנתונים בטבלה הוא:
Dim x,haour
do until rs.EOF%>
<tr>
<%for each x in rs.Fields
%>
<td><%Response.Write(x.value)%></td>
<%next
rs.MoveNext%>
</tr>
<%loop
עכשיו יש לי פונקציה שמקבלת ערך ומחזירה שעה לפי הערך, אני רוצה לבצע את הפונקציה בשביל ליצור עוד תא בטבלה, הערך נמצא בתוך המסד נתונים והוא הערך הראשון שנקרא. איך אני יכול לגשת אליו?
תודה מראש,
גיא
לא כל כך ברורה לי השאלה…
הפונקציה הזו, היא בצד השרת או בצד הלקוח?
בצד השרת – פירוט בפנים
אני מתכוון שיש לי קוד שבעזרתו אני מדפיס את כל הטבלה במסד נתונים
הקוד:
do until rs.EOF%>
<tr>
<%for each x in rs.Fields
%>
<td><%Response.Write(x.value)%></td>
<%next
rs.MoveNext%>
</tr>
<%loop
אני רוצה שבכל שורה אני יפעיל פונקציה לפי הערך הראשון בשורה… יש דרך לעשות את זה?
אכן לא ברור, אבל אם הבנתי נכון אז
תוסיף תנאי בלולאה שמזהה את השדה לפי השם שלו. נניח ששם השדה הוא fHour
אז צ"ל משהוא כזה
Dim x,haour,sTxt
do until rs.EOF%>
<tr>
<%for each x in rs.Fields
if x.name=fHour then
sTxt=GoFunction()
else
sTxt=x.value
%>
<td><%Response.Write(sTxt)%></td>
<%next
rs.MoveNext%>
</tr>
<%loop
הבנת נכון אבל זה עדיין לא פועל,
או שהשגיאה בקוד שמדפיס או בפונקציה…
הקוד:
Dim x,haour,tstart,tend
do until rs.EOF%>
<tr>
<%for each x in rs.Fields
if x.name=haour then
tstart=startf(x.value)
tend=endf(x.value)
else%>
<td><%Response.Write(x.value)%></td>
<%end if
next%>
<td><%=tstart%></td>
<td><%=tend%></td>
<%rs.MoveNext%>
</tr>
<%loop
rs.close
conn.close
%>
הפונקציות tstart ו- tend (אותה פונקציה רק שינוי ערכים)
FUNCTION startf(num)
SELECT CASE num
CASE "1"
num = "7:45"
CASE "2"
num = "8:35"
CASE "3"
num = "9:25"
CASE "4"
num = "10:30"
CASE "5"
num = "11:20"
CASE "6"
num = "12:15"
CASE "7"
num = "1:00"
CASE "8"
num = "1:50"
CASE "9"
num = "2:40"
END SELECT
startf = num
END FUNCTION
FUNCTION endf(num)
SELECT CASE num
CASE "1"
num = "8:30"
CASE "2"
num = "9:20"
CASE "3"
num = "10:10"
CASE "4"
num = "11:15"
CASE "5"
num = "12:05"
CASE "6"
num = "12:50"
CASE "7"
num = "1:45"
CASE "8"
num = "2:30"
CASE "9"
num = "3:25"
END SELECT
startf = num
END FUNCTION
זה פשוט לא מדפיס כלום… יש למישהו לפיתרון?
תודה מראש
האם רשמת ערך למשתנה haour ?
בקוד שרשמתי לא הכנסתי את הערך למשתנה כלומר צ"ל
haour ="fieldName" ' שם השדה הראשון
do until rs.EOF%>
<tr>
<%for each x in rs.Fields
if x.name=haour then
…
haour זה הערך, שמתי בגרשיים ועכשיו
הסקריפט פועל, תודה!!!
עוד שאלה, תודה רבה לכל העונים!
איך אני יכול לשנות את השורה הראשונה בקובץ?
להוסיף שורה חדשה אני יודע אבל לשנות את שורה מסויימת לא.
תודה מראש!
עידכון רשומה
כדי לעדכן רשומה אתה צריך מזהה רשומה – בדוגמא RecId, ב DATA תרשום את שם השדה = ערך חדש, תרשום רק את השדות שאתה רוצה לשנות המשתנה DATA הוא מחרוזת אבל אם אתה רושם מספרים תשים לב לא להכניס אותם לתוך גרש בודד.
אם לא תרשום מזהה רשומה כלומר לא תכתוב – where ID="& RecId אז כל הרשומות ישתנו ויקבלו את הערכים החדשים (נוח להשתמש בזה אם אתה רוצה לשנות ערך של שדה מסויים בכל הרשומות שיהיה זהה בכולן)
תשנה את שם הטבלה.
RecId=1
With Request
Data="HebName='"& .Form("text1")&"',EngName='"& .Form("text2")&"',IconName='"& .Form("text3")&"'"
End With
conn.Execute "update Tabname set "& Data &" where ID="& RecId
מצטער על ההטעיה התכוונתי לקובץ טקסט
התכוונתי איך אני משנה את השורה הראשונה בקובץ טקסט ולא במסד נתונים.
מצטער…
אז ככה:
אתה צריך קודם כל לשלוף את התוכן של הקובץ בעזרת FSO למחרוזת, ואז על המחרוזת הזו אתה עושה את ההחלפה, ובסוף אתה מחזיר את המחרוזת לקובץ, שוב בעזרת FSO.