Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 13:48:30 - Gert Lindholm, i forum sql-server/msde, Tråden har 11 Kommentarer och lästs av 1425 personer

Hej Jag har en sp som ska kolla en sträng och sedan skicka tillbaks ett värde.
När jag debugar så ser jag att det finns en rad. men inget värde. Har jag skivit fel någonstans i Sp:n eller kan man inte köra SELECT från en Temptabell?

ALTER PROCEDURE [dbo].[p_generateLicNbr] 
	-- Add the parameters for the stored procedure here
	@parmAge	nchar(10)	,
	@parmSex	nvarchar (1)	,
	@parmFirstName	nvarchar(50)	,
	@parmLicNbr	nvarchar(12)	,
	@parmOK		int		output
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	DECLARE @varLicNbr		nvarchar(12);
	DECLARE @varMaxLicNbr	nvarchar(10);
SET @varMaxLicNbr = @parmSex + SUBSTRING(@parmAge,9,2) + 
SUBSTRING(@parmAge,6,2) + SUBSTRING(@parmAge,3,2) + 
UPPER(SubString(@parmFirstName,1,3));

SET @varLicNbr = (SELECT MAX(LicNbr) FROM bo_Licence WHERE LicNbr LIKE @varMaxLicNbr + '%');

IF(SUBSTRING(@varLicNbr, 11,2) < '09') 
	BEGIN 
		SET @varLicNbr = SUBSTRING(@varLicNbr, 1, 11) + 
CAST(SUBSTRING(@varLicNbr, 11, 2) + 1 AS nvarchar(1)) ;
	END
	ELSE IF (SUBSTRING(@varLicNbr,12, 1) = '9')
	BEGIN
	    SET @varLicNbr = SUBSTRING(@varLicNbr, 1, 10) + 
CAST(SUBSTRING(@varLicNbr, 11, 2) + 1 AS nvarchar(2));
	    END
	    ELSE
		BEGIN
		SET @varLicNbr = SUBSTRING(@varLicNbr, 1, 11) + 
CAST(SUBSTRING(@varLicNbr, 12, 1) + 1 AS nvarchar(1));
		END
END
CREATE TABLE #LicNbr (LicNbr nvarchar(12));
	
	INSERT INTO #LicNbr (LicNbr)
			VALUES (@varLicNbr);
	SELECT * FROM #LicNbr;

	IF (@@rowcount > 0)
		BEGIN
			SET @parmOK = 0;
			
		END
	RETURN 0
DROP TABLE #LicNbr


Svara

Sv: Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 14:29:00 - Håkan Borneland

Vad skickar du in i parametrarna?


Svara

Sv: Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 14:48:20 - Håkan Borneland

Passar på att ge några synpunkter medan du svarar på föregående inlägg.

Lägg alla DDL satser (DECLARE, CREATE osv) först i SPn typ efter BEGIN/SET NOCIUNT ON.
(Syftar på att du skapar en tabell längst ner i Spn, kan skapa onödiga omkomplieringsar.)

Sedan så har du "krånglat" till det, du behöver ingen tabell för att få ut det du vill.
Skriv SELECT @varLicNbr; när du vill få ut strängen.

Om du mot förmodan ändå vill ha en tabell, så ska du skriva DROP TABLE innan du gör RETURN.

När man skapar tabeller med prefixt # så blir dom automatiskt temptabeller, och rensas upp när sessionen dör (DROP är alltså inter nödvändigt).
(ja SSMS gnäller att tabellen redan finns när du utvecklar, detta då sessionen lever så länge frågan är öppen (fliken)).

Sedan så tilldelar du bara utparametern ett värde när @@rowcount > 0.
Borde väl alltid ha ett värde så du kan läsa av hur det gått.
Sätt den t.ex till -1 default eller något.

Resten får provköras när du ger ett exempel på vad du skickar in, och vad du förväntar dig att få ut.


Svara

Sv:Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 16:08:25 - Gert Lindholm

Tack för hjälpen Håkan,
Om man i C# koden skickar in @parmLicNbr som en tom sträng för att få tag i den i Sp:n?

LicenceVO licVO = new LicenceVO();
DataSet dsRetVal = new DataSet();
SqlCommand objCmd = new SqlCommand("p_generateLicNbr", connection);
objCmd.CommandType = CommandType.StoredProcedure;
SqlDataAdapter objAdapter = new SqlDataAdapter(objCmd);
objAdapter.SelectCommand = objCmd;

objCmd.Parameters.Add("@parmLicNbr", SqlDbType.NVarChar);
objCmd.Parameters["@parmLicNbr"].Direction = ParameterDirection.Input;
objCmd.Parameters["@parmLicNbr"].Value = licNbr;
objCmd.Parameters["@parmLicNbr"].Size = 12;

objCmd.Parameters.Add("@parmOK", SqlDbType.Int);
objCmd.Parameters["@parmOK"].Direction = ParameterDirection.Output;
objCmd.Parameters["@parmOK"].Size = 10;


try
{
         connection.Open();
         objAdapter.Fill(dsRetVal);

         iRetVal = (int)objCmd.Parameters["@RETURN_VALUE"].Value;

         if (iRetVal == 0)
             foreach (DataRow dr in dsRetVal.Tables[0].Rows)
            {
                 licVO.LicNbr = Convert.ToString(dr["LicNbr"]).Trim();
            }
}
     catch (Exception e)
     {
         string message = e.Message;
     }
         finally
        {
            // Close connection
            if (connection.State != ConnectionState.Closed)
                connection.Close();
                objCmd.Dispose();
       }
       return licVO;


Om jag debuggar mig fram i koden så ser jag att Rows är 1, men LicNbr är en tom sträng.


Svara

Sv: Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 16:12:00 - Håkan Borneland

När du tilldelar parametern här med licNbr, så är licNbr en tom sträng, rätt?
objCmd.Parameters["@parmLicNbr"].Value = licNbr;


Svara

Sv:Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 16:17:14 - Håkan Borneland

Just det...
Dom andra parametrarna får dom något värde?


Svara

Sv:Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 16:17:28 - Gert Lindholm

Hur får jag då tag i resultatet från SELECT @parmLicNbr AS LicNbr

ALTER PROCEDURE [dbo].[p_generateLicNbr] 
	-- Add the parameters for the stored procedure here
@parmAge		nchar(10)	,
@parmSex		nvarchar (1),
@parmFirstName	nvarchar(50),
@parmLicNbr	nvarchar(12),
@parmOK		int	output

AS
BEGIN
	DECLARE @varMaxLicNbr	nvarchar(10)
	SET NOCOUNT ON;
SET @varMaxLicNbr = @parmSex + 
SUBSTRING(@parmAge,9,2) + 
SUBSTRING(@parmAge,6,2) + 
SUBSTRING(@parmAge,3,2) + 
UPPER(SubString(@parmFirstName,1,3));

SET @parmLicNbr = (SELECT MAX(LicNbr) FROM bo_Licence WHERE LicNbr LIKE @varMaxLicNbr + '%');

IF(SUBSTRING(@parmLicNbr, 11,2) < '09') 
	BEGIN 
	SET @parmLicNbr = SUBSTRING(@parmLicNbr, 1, 11) + 
CAST(SUBSTRING(@parmLicNbr, 11, 2) + 1 AS nvarchar(1)) ;
	END
	ELSE IF (SUBSTRING(@parmLicNbr,12, 1) = '9')
		BEGIN
		SET @parmLicNbr = SUBSTRING(@parmLicNbr, 1, 10) + 
CAST(SUBSTRING(@parmLicNbr, 11, 2) + 1 AS nvarchar(2));
		END
		ELSE
			BEGIN
		SET @parmLicNbr = SUBSTRING(@parmLicNbr, 1, 11) + 
CAST(SUBSTRING(@parmLicNbr, 12, 1) + 1 AS nvarchar(1));
			END
END

SELECT @parmLicNbr AS LicNbr;
	
	IF (@@rowcount > 0)
		BEGIN
			SET @parmOK = 0;
			
		END
	RETURN 0


Svara

Sv: Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-26 20:52:48 - Håkan Borneland

Gert,

Om jag fattade dig rätt i ditt exempel och du bara skickar in en tom sträng i @paramLicNbr så blir den NULL.
Så det är inte konstigt om du inte ser något.

Du borde skicka in något på @paramAge, @paramFirstName och @paramSex.
Kan du ger mer exempel på indata (inparameter) till sprocen?


Svara

Sv:Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-27 01:38:24 - Gert Lindholm

Hej Håkan,

I mitt testexempel, skickar jag in
@parmAge='1960-03-18'
@parmSex = 'M'
@parmFirstName = 'Gert'

Sp:n kollar om det finns något LicNbr med strängen'M180360GER' och tilldelar det högsta + 1
I mitt testfall så får jag svaret av SELECT @parmLicNbr AS LicNbr = 'M180360GER03'
Set vill jag då få tag i c# koden.
licVO.LicNbr = Convert.ToString(dr["LicNbr"]).Trim();


Tack för ditt engangemang :)


Svara

Sv: Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-01-27 21:52:12 - Håkan Borneland

Bra att du fick ut något från SPn.
Nu gäller det att få till det på "andra sidan".
Du behöver inte skicka in någon tom sträng för att få ut LicNbr.
Den kan du ta bort.
Gäller även output parametern @paramOK.
Har med båda ändå i mitt exempel.
Är inte van att hämta data på det sättet du gör.
Ger ett exempel här nedan som du kan anpassa och prova.

<code>
SqlConnection conn = new SqlConnection("Din connectionsträng");
SqlCommand cmd = new SqlCommand("p_generateLicNbr", conn);
cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add("@parmAge", SqlDbType.NChar, 10).Value = "1960-03-18";
cmd.Parameters.Add("@parmSex", SqlDbType.NVarChar, 1).Value = "M";
cmd.Parameters.Add("@parmFirstName", SqlDbType.NVarChar, 50).Value = "Gert";
cmd.Parameters.Add("@parmLicNbr", SqlDbType.NVarChar, 12).Value = "";
cmd.Parameters.Add("@parmOK", SqlDbType.Int).Direction = ParameterDirection.Output;

conn.Open();
cmd.Prepare();

string result = "";
SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

if (reader.HasRows)
{
while (reader.Read())
{
result = reader.GetValue(0).ToString();
}
}

reader.Close();
</code>


Svara

Sv:Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-02-04 13:24:40 - Gert Lindholm

Tack Håkan,
Har legat sjuk ett tag men är nu "back in business"

Ändrade i c# koden som du skrev. Men jag fick även ändra i Sp:n för att få tillbaks rätt värde.
Den Konverterade MM som t.ex. "Mar" Jag hade Age som en string istället för DateTime.
Men nu fungerar det som jag vill.

Tack


Svara

Sv: Får en tillbaks @parmLicNbr SQL2005

Postades av 2009-02-04 13:47:23 - Håkan Borneland

Bra.
Skönt att du kommer framåt.
Meningen är ju att du ska ändra så det blir bra för dig.
Är ju mest generell hjälp.
Hoppas själv vara i "business" i morgon efter att varit "däckad" ett bra tag (samma virus (bug))?


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 873
27 965
271 770
531
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies