Solved

How to use sqlDataReader with Stored Procedure

Posted on 2011-03-04
3
759 Views
Last Modified: 2012-08-13
I'm trying to select a single row from a single table in my MSSQL database using a datareader for speed and a stored procedure for abstraction.
Please see the SP and C# code atached.
If I just insert the SQL into the connection string (and remove the connection type line) it works perfectly. If i run the SP in Management Studio it works perfectly. If I run it as it is below I get an empty reader.
So I must be doing something wrong in passing the parameters back and forth, and I'm hoping it is something obvious!
SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["IntranetConnectionString"].ConnectionString);
            SqlCommand sqlCmd = new SqlCommand("usp_select_user_by_alias", sqlConn);
            sqlCmd.CommandType = CommandType.StoredProcedure;

            SqlParameter sqlParam = new SqlParameter();
            sqlParam.ParameterName = "@alias_in";
            sqlParam.SqlDbType = SqlDbType.NVarChar;
            sqlParam.Direction = ParameterDirection.Input;
            sqlParam.Value = _alias;
            sqlCmd.Parameters.Add(sqlParam);

            SqlDataReader sqlReader;

            try
            {
                sqlConn.Open();
                sqlReader = sqlCmd.ExecuteReader();
                sqlReader.Read();
                _guid = ((Guid)sqlReader["user_id"]).ToString();
                _alias = (string)sqlReader["alias"];
                _displayName = (string)sqlReader["displayname"];
                _firstName = (string)sqlReader["firstname"];
                _surname = (string)sqlReader["surname"];
                _title = (string)sqlReader["title"];
                _phone = (string)sqlReader["phone"];
                _fax = (string)sqlReader["fax"];
                _mobile = (string)sqlReader["mobile"];
                _dmsId = (string)sqlReader["dms_id"];
                _ext = (string)sqlReader["extension"];
                _addr = (string)sqlReader["street_address"];
                _town = (string)sqlReader["town"];
                _county = (string)sqlReader["county"];
                _postcode = (string)sqlReader["postcode"];
                _email = (string)sqlReader["email"];
                _office = (string)sqlReader["office"];
                _active = (bool)sqlReader["active"];
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to fill IntranetUser from Database. " + ex.Message);
            }
            finally
            {
                sqlConn.Close();
            }

Open in new window

USE [intranetdb]
GO
/****** Object:  StoredProcedure [dbo].[usp_select_user_by_alias]    Script Date: 03/03/2011 16:26:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:	xxxxxxxxxxxx
-- Create date:   xxxxxxxxxxxx
-- Description:	xxxxxxxxxxxxxxxx
-- =============================================
ALTER PROCEDURE [dbo].[usp_select_user_by_alias] 
	(
	@alias_in NVarChar(100)
    )
AS
BEGIN
	SET NOCOUNT ON;

	SELECT user_id, alias, displayname, firstname, surname, title, phone, fax, mobile, dms_id, extension, street_address, town, county, postcode, email, office, active 
		FROM users 
		WHERE alias = @alias_in;
END

Open in new window

0
Comment
Question by:silent_waters
3 Comments
 
LVL 142

Accepted Solution

by:
Guy Hengel [angelIII / a3] earned 250 total points
ID: 35035017
>sqlParam.SqlDbType = SqlDbType.NVarChar;
you need to specify a Size also, otherwise it might presume size of 1, and hence truncate the value for the parameter

apart from that, you either don't have the good value for _alias there, or are connecting to another database than in your SQL Managaement Studio ...
0
 
LVL 9

Expert Comment

by:mayank_joshi
ID: 35035026
try using while  (sqlReader.Read())


SqlConnection sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["IntranetConnectionString"].ConnectionString);
            SqlCommand sqlCmd = new SqlCommand("usp_select_user_by_alias", sqlConn);
            sqlCmd.CommandType = CommandType.StoredProcedure;

            SqlParameter sqlParam = new SqlParameter();
            sqlParam.ParameterName = "@alias_in";
            sqlParam.SqlDbType = SqlDbType.NVarChar;
            sqlParam.Direction = ParameterDirection.Input;
            sqlParam.Value = _alias;
            sqlCmd.Parameters.Add(sqlParam);

            SqlDataReader sqlReader;

            try
            {
                sqlConn.Open();
                sqlReader = sqlCmd.ExecuteReader();
               while  (sqlReader.Read())
{
                _guid = ((Guid)sqlReader["user_id"]).ToString();
                _alias = (string)sqlReader["alias"];
                _displayName = (string)sqlReader["displayname"];
                _firstName = (string)sqlReader["firstname"];
                _surname = (string)sqlReader["surname"];
                _title = (string)sqlReader["title"];
                _phone = (string)sqlReader["phone"];
                _fax = (string)sqlReader["fax"];
                _mobile = (string)sqlReader["mobile"];
                _dmsId = (string)sqlReader["dms_id"];
                _ext = (string)sqlReader["extension"];
                _addr = (string)sqlReader["street_address"];
                _town = (string)sqlReader["town"];
                _county = (string)sqlReader["county"];
                _postcode = (string)sqlReader["postcode"];
                _email = (string)sqlReader["email"];
                _office = (string)sqlReader["office"];
                _active = (bool)sqlReader["active"];
}
            }
            catch (Exception ex)
            {
                throw new Exception("Failed to fill IntranetUser from Database. " + ex.Message);
            }
            finally
            {
                sqlConn.Close();
            }

Open in new window

0
 

Author Closing Comment

by:silent_waters
ID: 35035089
Angelll, yet again you've solved a problem in seconds that has been bugging me for hours! Thank you very much indeed.
0

Featured Post

Best Practices: Disaster Recovery Testing

Besides backup, any IT division should have a disaster recovery plan. You will find a few tips below relating to the development of such a plan and to what issues one should pay special attention in the course of backup planning.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this article I will describe the Backup & Restore method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
In a recent question (https://www.experts-exchange.com/questions/28997919/Pagination-in-Adobe-Acrobat.html) here at Experts Exchange, a member asked how to add page numbers to a PDF file using Adobe Acrobat XI Pro. This short video Micro Tutorial sh…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

832 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question