Solved

How to use sqlDataReader with Stored Procedure

Posted on 2011-03-04
3
779 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
3 Comments
 
LVL 143

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

Migrating Your Company's PCs

To keep pace with competitors, businesses must keep employees productive, and that means providing them with the latest technology. This document provides the tips and tricks you need to help you migrate an outdated PC fleet to new desktops, laptops, and tablets.

Question has a verified solution.

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

This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
Ever needed a SQL 2008 Database replicated/mirrored/log shipped on another server but you can't take the downtime inflicted by initial snapshot or disconnect while T-logs are restored or mirror applied? You can use SQL Server Initialize from Backup…
Come and listen to Percona CEO Peter Zaitsev discuss what’s new in Percona open source software, including Percona Server for MySQL (https://www.percona.com/software/mysql-database/percona-server) and MongoDB (https://www.percona.com/software/mongo-…
There's a multitude of different network monitoring solutions out there, and you're probably wondering what makes NetCrunch so special. It's completely agentless, but does let you create an agent, if you desire. It offers powerful scalability …

707 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