קבלת משוב מAJAX שנשלח לSQL
-
אני שולח פוסט בAJAX שיבצע משהו בSQL,
רציתי לדעת האם אפשר לקבל משוב האם הפעולה בSQL בוצעה כראוי או שהשאילתא לא הצליחה.
לדוגמא:
USE [Hotel] GO /****** Object: StoredProcedure [dbo].[DelClient] Script Date: 14/01/2016 13:42:14 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[DelClient] @number int AS if exists (select client_id from reservations where client_id = @number) BEGIN RAISERROR('אין אפשרות למחוק לקוח לפני מחיקת ההזמנות הרשומות על שמו',1,16) rollback transaction return END if not exists(select client_id from client where client_id = @number) BEGIN RAISERROR('לקוח לא קיים',1,17) rollback transaction return END BEGIN DELETE FROM [dbo].[client] WHERE client_id= @number END
אני רוצה שהפוסט יחזיר לי את השגיאה שחזרה מהדטה בייס במקרה והיתה
יש דבר כזה?פורסם במקור בפורום CODE613 ב14/01/2016 13:44 (+02:00)
-
לתפוס את השגיאות בסי שארפ זה try catch רגיל
איפה השוני בין זה לבין שגיאה בסתם שורת קוד?
אני בעיקרון פחות אוהב לזרוק שגיאות ב sql עצמו אלא להחזיר הודעה מסודרת
בכדי להחזיר ערכים מפרוצדורה אתה יכול לבצע משפט סלקט בסוף הפרוצדורה ולקרוא לה דרך sqladapter.fill ואז תקבל את התוצאות של הסלקט הזה לטבלה
מקווה שהייתי ברורפורסם במקור בפורום CODE613 ב19/01/2016 03:05 (+02:00)
-
הא לך מחלקת עזר נחמדה, שיכולה לחסוך לך הרבה קוד "מלוכלך" בכל מה שקשור לקריאות ל SQL:
using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SQL.GeneralSQLHelper.Commanders { public class SQLServerCommander { /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sqlstatement"></param> /// <param name="ValueIfNull"></param> /// <param name="connection"></param> /// <returns></returns> public static T ReadScalarValueFromSQl<T>(string sqlstatement, T ValueIfNull, SqlConnection connection) { bool ConnectionPassOpening = (connection.State == ConnectionState.Open); SqlCommand sqlCommand = new SqlCommand( sqlstatement, connection); if (!ConnectionPassOpening) { connection.Open(); } SqlDataReader reader = sqlCommand.ExecuteReader(); T result = ValueIfNull; if (reader.Read() && !reader.IsDBNull(0)) { result = (T)reader[0]; } if (!ConnectionPassOpening) { connection.Close(); } return result; } /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="sqlstatement"></param> /// <param name="ValueIfNull"></param> /// <param name="ConnectionString"></param> /// <returns></returns> public static T ReadScalarValueFromSQl<T>(string sqlstatement, T ValueIfNull, string ConnectionString) { return ReadScalarValueFromSQl<T>(sqlstatement, ValueIfNull, new SqlConnection(ConnectionString)); } /// <summary> /// /// </summary> /// <param name="sqlstatement"></param> /// <param name="commandType"></param> /// <param name="connection"></param> /// <returns></returns> public static DataTable GetDataTableFromSql(string sqlstatement, CommandType commandType, SqlConnection connection) { bool ConnectionPassOpening = (connection.State == ConnectionState.Open); if (!ConnectionPassOpening) { connection.Open(); } SqlCommand sqlCommand = new SqlCommand( sqlstatement, connection); sqlCommand.CommandType = commandType; SqlDataAdapter da = new SqlDataAdapter(sqlCommand); DataTable finalytable = new DataTable(); da.Fill(finalytable); if (!ConnectionPassOpening) { connection.Close(); } return finalytable; } /// <summary> /// /// </summary> /// <param name="sqlstatement"></param> /// <param name="commandType"></param> /// <param name="ConnectionString"></param> /// <returns></returns> public static DataTable GetDataTableFromSql(string sqlstatement, CommandType commandType, string ConnectionString) { return GetDataTableFromSql(sqlstatement, commandType, new SqlConnection(ConnectionString)); } /// <summary> /// /// </summary> /// <param name="sqlstatement"></param> /// <param name="connection"></param> /// <returns></returns> public static int ExecuteNonQuery(string sqlstatement, SqlConnection connection) { SqlCommand sqlCommand = new SqlCommand( sqlstatement, connection); sqlCommand.CommandType = CommandType.Text; bool ConnectionPassOpening = (connection.State == ConnectionState.Open); if (!ConnectionPassOpening) { connection.Open(); } var result = sqlCommand.ExecuteNonQuery(); if (!ConnectionPassOpening) { connection.Close(); } return result; } /// <summary> /// /// </summary> /// <param name="sqlstatement"></param> /// <param name="ConnectionString"></param> /// <returns></returns> public static int ExecuteNonQuery(string sqlstatement, string ConnectionString) { return ExecuteNonQuery(sqlstatement, new SqlConnection(ConnectionString)); } } }
פורסם במקור בפורום CODE613 ב19/01/2016 09:17 (+02:00)
-
@יאן גולד
RAISERROR('אין אפשרות למחוק לקוח לפני מחיקת ההזמנות הרשומות על שמו',1,16)
עכשיו אני שם לב שאתה שם ב severity level את הערך 1 שזה בעצם מביא הודעת INFO ולא EXCEPTION ולכן אתה לא תופס את זה בקוד
תשתמש במשהו בין 11 ל 16
בלי קשר הודעות INFO הם דרך מצוינת לסמן progress אצל המשתמש, צריך להירשם לאירוע InfoMessage של ה sqlconnection בכדי לקבל אותן
https://msdn.microsoft.com/en-us/library/a0hee08w.aspxפורסם במקור בפורום CODE613 ב19/01/2016 13:37 (+02:00)