Hej Jag har en sp som ska kolla en sträng och sedan skicka tillbaks ett värde. Passar på att ge några synpunkter medan du svarar på föregående inlägg. Tack för hjälpen Håkan, När du tilldelar parametern här med licNbr, så är licNbr en tom sträng, rätt? Hur får jag då tag i resultatet från SELECT @parmLicNbr AS LicNbr Gert, Hej Håkan, Bra att du fick ut något från SPn. Tack Håkan, Bra.Får en tillbaks @parmLicNbr SQL2005
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
Sv: Får en tillbaks @parmLicNbr SQL2005
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.Sv:Får en tillbaks @parmLicNbr SQL2005
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.
Sv: Får en tillbaks @parmLicNbr SQL2005
objCmd.Parameters["@parmLicNbr"].Value = licNbr;Sv:Får en tillbaks @parmLicNbr SQL2005
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
Sv: Får en tillbaks @parmLicNbr SQL2005
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?Sv:Får en tillbaks @parmLicNbr SQL2005
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 :)Sv: Får en tillbaks @parmLicNbr SQL2005
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>Sv:Får en tillbaks @parmLicNbr SQL2005
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.
TackSv: Får en tillbaks @parmLicNbr SQL2005
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))?