webForumDet fria alternativet

SP, @@Identity och C#

.NET

4 svar · 383 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag har den här koden i mitt datalager:

		protected int InsSqlQuery(string StoredProcName, IDataParameter[] Parameters)
		{			
			try
			{
				
				Connection.Open();
				SqlCommand Command = BuildCommand(StoredProcName,Parameters);
				Command.Parameters.Add(new SqlParameter("@@Identity", SqlDbType.Int, 4, ParameterDirection.Output, false, 0, 0, string.Empty, DataRowVersion.Default, null));
				Command.ExecuteNonQuery();
				return ((int)Command.Parameters["@@Identity"].Value);
			}
			finally
			{
				Connection.Close();
			}
		}

koden i BL ser ut så här:

		public int AddProfile(string name,int userid)
		{
			int rowsaffected = 0;
			try
			{
				SqlParameter[] parameters = 
					{
						new SqlParameter("@belongsto", SqlDbType.Int),
						new SqlParameter("@name", SqlDbType.NVarChar,30),
				};

				parameters[0].Value = userid;
				parameters[1].Value = name;

				InsSqlQuery("sp_AddProfile", parameters);
				return rowsaffected;
			}
			catch
			{
				return 0;
			}
		}

Men jag får tillbaka 0 hela tiden och inget sparas i databasen, SP:n som skickas in ser ut så här:

ALTER PROCEDURE webdns.sp_AddProfile
	@belongsto int,
	@name nvarchar(30)
AS
		INSERT INTO Profiles ([Name],BelongsTo) VALUES(@name,@belongsto)
Medlem sedan nov. 20022 355 inlägg
#2

rowsaffected är alltid noll, men det säger ju inget om att det inte görs någon insert!

Medlem sedan jan. 20013 341 inlägg
#3

Såg det med nu :D
Ändrade i BL till:

		public int AddProfile(string name,int userid)
		{
			try
			{
				SqlParameter[] parameters = 
					{
						new SqlParameter("@belongsto", SqlDbType.Int),
						new SqlParameter("@name", SqlDbType.NVarChar,30),
				};

				parameters[0].Value = userid;
				parameters[1].Value = name;

				return InsSqlQuery("sp_AddProfile", parameters);
			}
			catch
			{
				return 0;
			}
		}

men det gjorde ingen skillnad

Medlem sedan jan. 20013 341 inlägg
#4

Ändrade:

ALTER PROCEDURE webdns.sp_AddProfile
	@belongsto int,
	@name nvarchar(30),
    @identity int output
AS
		INSERT INTO Profiles ([Name],BelongsTo) VALUES(@name,@belongsto)
		Set @identity = @@identity

Tack till Brimba

Medlem sedan maj 20012 812 inlägg
#5

Det är bättre att använda dig av SCOPE_IDENTITY() istället för @@IDENTITY då det inte är säkert att @@IDENTITY ger dig tillbaka det identityt som du tror att du skall få.

För att veta mer så kan du läsa i BooksOnline som följer med SQL Server så får du reda på "problemet" med @@IDENTITY

- Magnus

265 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)