sql server
-
אני מנסה לכתוב פרוצדורה שמכניסה נתונים ל2 טבלאות
כאשר בכל טבלה יש ID .
הטבלה השניה מקבלת מהראשונה את הID- מפתח של הראשון ומכניסה אותו כאחד מהנתונים
ואת הID -מפתח של הטבלה השניה אני רוצה להחזיר בכל קריאה לפרוצדורה
זה מה שכתבתי וזה מחזיר לי -1
מה הבעיה .?ALTER PROCEDURE [dbo].[INSERT_DOC] -- Add the parameters for the stored procedure here @docName nvarchar(50) = 0, @autherName nvarchar(50) = 0, @docPath nvarchar(50) = 0, @docDate date AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for procedure here INSERT INTO AUTHER (AUTHER_NAME) VALUES (@autherName) INSERT INTO DOC (DOC_NAME,AUTHER_ID, DOC_PATH,DOC_DATE) VALUES (@docName,@@IDENTITY, @docPath, @docDate) SELECT SCOPE_IDENTITY() as D_ID END
-
-
האם כשאני קוראת
AS D_ID
זה לא נקרא שאני מכנה את כל השורה SELECT SCOPE_IDENTITY()
בשם
D_ID
הטבלה עצמה מכילה את העמודה
DOC_ID -
@שרה-רחל אמר בsql server:
האם כשאני קוראת
AS D_ID
זה לא נקרא שאני מכנה את כל השורה SELECT SCOPE_IDENTITY()
בשם
D_ID
הטבלה עצמה מכילה את העמודה
DOC_IDזה כן, רק חשבתי שאולי זו בעיה של שמות.
- האם ההכנסה הראשונה מתבצעת כראוי?
- האם בהכנסה השנייה הערך AUTHER_ID שמוכנס ל-DOC הוא כן תקין?
-
זה השדות של DOC:
-[DOC_NAME]INT ,[AUTHER_ID]-nvarchar(50) - ,[DOC_PATH]-INT ,[DOC_DATE]-DATE וזה השדות של AUTHER AUTHER_ID-INT AUTHER_NAME-nvarchar(50)
-
אולי ההמרה של הDATE משפת C# בויזואל סטודיו שהוא מסוג DateTime
לSQL SERVER מסוג DATE
שגויה ? -
- האם ההכנסה הראשונה מתבצעת כראוי?
- האם בהכנסה השנייה הערך AUTHER_ID שמוכנס ל-DOC הוא כן תקין?
לא עניתם על השאלות...
-
כן
ההכנסות מתבצעות כראוי -
@שרה-רחל אמר בsql server:
ההכנסות מתבצעות כראוי
אם ההכנסות מתבצעות כראוי, אז כנראה אין בעיה בקריאה מ-C#.
מדוע השדה DOC_PATH מוגדר כ INT אבל הפרמטר @docPath כ NVARCHAR? -
טעות
[DOC_NAME]nvarchar(50 ,[AUTHER_ID]-)int - ,[DOC_PATH]-nvarchar(50 ,[DOC_DATE]-DATE
-
איך אני גורמת לפרוצדורה להחזיר את הערך של הID האחרון שהוכנס לDOC
-
@שרה-רחל בעיקרון SCOPE_IDENTITY() אמור לעבוד.
תנסו אולי כך:SELECT IDENT_CURRENT('DOC') AS D_ID
-
-
@שרה-רחל אמר בsql server:
מה הכוונה של DOC
כך הוא התחביר של IDENT_CURRENT, צריך לציין את שם הטבלה שממנה שולפים את שדה הזהות.
-
@שרה-רחל נשמח להתעדכן אם הבעיה נפתרה וכיצד.
-
-
@שרה-רחל מעניין...
האם תוכלו לפרט את הגדרות הטבלאות ב-SQL? -
יש פקודה שמיצאת את כל הבסיסי נתונים ?
-
-
@שרה-רחל אמר בsql server:
יש פקודה שמיצאת את כל הבסיסי נתונים ?
לא צריך את הכל. רק את שתי הטבלאות הנ"ל.
בSSMS קליק ימני על הטבלה >
Script Table as > CREATE to > New Query Editor windowולהעתיק את תוכן החלון שנפתח
-
USE [lib] GO /****** Object: Table [dbo].[AUTHER] Script Date: 7/17/2020 7:55:40 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AUTHER]( [AUTHER_ID] [int] IDENTITY(1,1) NOT NULL, [AUTHER_NAME] [nvarchar](50) NULL, CONSTRAINT [PK_AUTHER] PRIMARY KEY CLUSTERED ( [AUTHER_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO USE [lib] GO /****** Object: Table [dbo].[DOC] Script Date: 7/17/2020 7:56:12 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[DOC]( [DOC_ID] [int] IDENTITY(1,1) NOT NULL, [DOC_NAME] [nvarchar](50) NULL, [AUTHER_ID] [int] NULL, [DOC_PATH] [nvarchar](50) NOT NULL, [DOC_DATE] [date] NULL, CONSTRAINT [PK_DOC] PRIMARY KEY CLUSTERED ( [DOC_ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[DOC] WITH CHECK ADD CONSTRAINT [FK_DOC_AUTHER] FOREIGN KEY([AUTHER_ID]) REFERENCES [dbo].[AUTHER] ([AUTHER_ID]) GO ALTER TABLE [dbo].[DOC] CHECK CONSTRAINT [FK_DOC_AUTHER] GO
אולי צריך להגדיר בפרוצדורה RETURN?
-
-
@OdedDvir אמר בsql server:
ExecuteScalar
זה הקוד של השליחה לפונקציה ושיניתי כאמור כפי שכתבתם רק עכשיו זה מתריע לי שהפונקיה מחזירה OBJECTולא INT
public int InsertDoc( string docName, string autherName, string docPath, DateTime docDate) { using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("lib`"))) { List<Doc> doc = new List<Doc>(); doc.Add(new Doc { DocName = docName , autherName = autherName, DocPath = docPath , DocDate = docDate }); return connection.ExecuteScalar("dbo.INSERT_DOC @docName, @autherName, @docPath, @docDate", doc); } }
-
מנסה להמיר לINT
return Convert.ToInt32(connection.ExecuteScalar("dbo.INSERT_DOC @docName, @autherName, @docPath, @docDate", doc));
ומחזיר לי את השגיאה בהרצה An enumerable sequence of parameters (arrays, lists, etc) is not allowed in this context
-
@שרה-רחל אני חושב שזה בגלל שהפרוצדורה מחזירה רשומה ולא ערך יחיד.
תנסו להחליף את הערך המוחזר בפרוצדורה.
במקום:SELECT SCOPE_IDENTITY() as D_ID
לרשום:
RETURN SCOPE_IDENTITY()
-
@OdedDvir אמר בsql server:
RETURN SCOPE_IDENTITY()
לא עזר
ניסיתי גם להריץ דרך הSQL SERVER ישירות
וכשאני מריצה את ה פרוצדורה עם השורה SELECT SCOPE_IDENTITY() as D_ID
הוא מחזיר לי את העמודה הרלוונטית
וכשאני מריצה עם השורה RETURN SCOPE_IDENTITY()
הוא כותב שזה עבר ולא מחזיר לי ערך
ב2 המקרים בקריאה דרך ויזואל סטודיו מחזיר את אותה השגיאה שצינתי לעיל
תודה -
@שרה-רחל אמר בsql server:
ב2 המקרים בקריאה דרך ויזואל סטודיו מחזיר את אותה השגיאה שצינתי לעי
סליחה
דרך הSQL SERVER
זה כן מחזיר לי ערכים
השגיאה היא רק דרך VISUAL STUDIO -
@שרה-רחל אמר בsql server:
השגיאה היא רק דרך VISUAL STUDIO
התחביר שאתם מריצים ב VS לא תקין.
תנסו את הקוד הבא:public int InsertDoc( string docName, string autherName, string docPath, DateTime docDate) { using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.CnnVal("lib`"))) { SqlCommand command = new SqlCommand("dbo.INSERT_DOC", connection); command.Connection.Open(); command.CommandType = CommandType.StoredProcedure; command.Parameters.AddWithValue("@docName", docName); command.Parameters.AddWithValue("@autherName", autherName); command.Parameters.AddWithValue("@docPath", docPath); command.Parameters.AddWithValue("@docDate", docDate); return Convert.ToInt32(command.ExecuteScalar()); } }
-
@שרה-רחל אמר בsql server:
וכשאני מריצה את ה פרוצדורה עם השורה SELECT SCOPE_IDENTITY() as D_ID
הוא מחזיר לי את העמודה הרלוונטיתתשאירו את הפרוצדורה המקורית בשימוש עם ExecuteScalar כנ"ל