2016-10-03 37 views
0

我对C#非常新,所以请原谅我的无知。我有一个SQL Server表,我试图从该表中将选择查询结果转换为C#中的表单组合框。C#从SQL Server数据库获取结果,通过类显示在组合框中

我在试图做的是创建一个类,它将在数据库端执行一个存储过程,而我的绊脚石是如何将该类整合到代码中,以便结果显示在C#中的下拉列表中。

这是我到目前为止在C#中的。非常感谢您的帮助。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Data; 
using System.Data.SqlClient; 
using System.Configuration; 

namespace MedicalOffice 
{ 
    public class DBAIdSelect 
    { 
     public void SelectPractice() 
     { 
      using (SqlConnection cn = new SqlConnection()) 
      { 
       cn.ConnectionString = GetConnectionString(); 
       cn.Open(); 

       using (SqlCommand cmd = new SqlCommand("SelectPracticeID")) 
       { 
        cmd.Connection = cn; 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.ExecuteNonQuery(); 
       } 
      } 
     } 

     private string GetConnectionString() 
     { 
      string conString = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
      return conString; 
     } 
    } 
} 

SQL Server表:

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Practices] 
(
    [PracticeID] [int] IDENTITY(1,1) NOT NULL, 
    [PracticeName] [varchar](50) NULL, 
    [Address1] [varchar](50) NULL, 
    [Address2] [varchar](50) NULL, 
    [City] [varchar](50) NULL, 
    [State] [char](2) NULL, 
    [Zip] [varchar](10) NULL, 
    [IsActive] [bit] NULL, 
    [DateCreated] [date] NULL 
     CONSTRAINT [DF_Practices_DateCreated] DEFAULT (getdate()), 
    [CreatedBy] [int] NULL, 
    [DateModified] [date] NULL, 
    [DateModifiedBy] [int] NULL, 

    CONSTRAINT [PK_Practices] 
     PRIMARY KEY CLUSTERED ([PracticeID] ASC) 
       WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
         IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
         ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
GO 

SET ANSI_PADDING OFF 
GO 

和存储过程:

create proc [dbo].[SelectPracticeID] 
as 
    select PracticeID 
    from dbo.Practices 
GO 
+4

您没有提问?但你的下一步将是从你的班级返回值。 'cmd.ExecuteNonQuery();'不会工作 - 您需要返回值。 – Jonesopolis

+1

Webforms,winforms,MVC,WCF?你使用什么技术? – Liam

+1

您调用存储来检索记录,但您没有对返回进行任何操作。例如,如果你得到一个datareader,你应该从那里读取记录。连接也没有关闭。网上有很多关于如何实现你想要实现的代码示例。 – derloopkat

回答

2

,每当你想调用存储过程可以使用这个类,它返回一个DataTable

class myclass 
{ 
    public DataTable SelectData(string proc, SqlParameter[] param) 
    { 
      DataTable Table = new DataTable(); 
      SqlCommand Cmd = new SqlCommand(); 
      Cmd.CommandType = CommandType.StoredProcedure; 
      Cmd.CommandText = proc; 
      Cmd.Connection = Acces.Connection; 

      if (param != null) 
       for (int i = 0; i < param.Length; i++) 
       { 
        Cmd.Parameters.Add(param[i]); 
       } 

      SqlDataAdapter Adapter = new SqlDataAdapter(Cmd); 
      Adapter.Fill(Table); 

      return Table; 
     } 
    } 

所以每当你要使用的任何存储过程返回结果集,使用它,如果你要执行任何数据:

public void ExecuteData(string proc, SqlParameter[] param) 
{ 
    SqlCommand Cmd = new SqlCommand(); 
    Cmd.CommandType = CommandType.StoredProcedure; 
    Cmd.CommandText = proc; 
    Cmd.Connection = Acces.Connection; 

    if (param != null) 
    { 
     Cmd.Parameters.AddRange(param); 
    } 

    Cmd.ExecuteNonQuery(); 
} 

让你们班这两个功能,每当你想调用类回到你一些数据或执行类似插入,更新,删除一些数据...

你只需要调用

function("Stored_Proc_Name", Parameters); 

例子:

我想你们这样一个选择的过程:

myclass classs = new myclass(); 
    DataTable Table = new DataTable(); 
    Table = classs.SelectData("SelectPracticeID",null); //=cause there is no paramters in your stored proc 

所以Table将持有已被你的数据库发送完整的信息

+0

就个人而言,我不是Untyped(又名“松散”)DataTables和DataSet的粉丝。 – granadaCoder

0

我建议建立DTO的/简单波科对您的数据。

这种“方式”需要更多的努力......但是你的对象模型将会干净,漂亮和可维护。

2003年DataTables很好,现在不再是2003年了。下面是“穷人的ORM”,但很容易就可以迁移到实体框架或NHibernate中。 Datatables,Datasets,特别是未定义的数据集,不易迁移。

[Serializable] 
public partial class Practice 
{ 
    public int PracticeKey { get; set; }     
    public string PracticeName { get; set; }     
} 

[Serializable] 
public class PracticeCollection : ICollection<Practice> 
{ 
} 

internal static class PracticeDefaultLayout 
{ 
    public static readonly int PRACTICE_KEY = 0; 
    public static readonly int PRACTICENAME = 1; 

} 


public class PracticeSerializer 
{ 

    public PracticeCollection SerializeCollection(IDataReader dataReader) 
    { 
     Practice item = new Practice(); 
     PracticeCollection returnCollection = new PracticeCollection(); 
     try 
     { 

      int fc = dataReader.FieldCount;//just an FYI value 

      int counter = 0;//just an fyi of the number of rows 

      while (dataReader.Read()) 
      { 

       if (!(dataReader.IsDBNull(PracticeSearchResultsLayouts.PRACTICE_KEY))) 
       { 
        item = new Practice() { PracticeKey = dataReader.GetInt32(PracticeSearchResultsLayouts.PRACTICE_KEY) }; 

        if (!(dataReader.IsDBNull(PracticeSearchResultsLayouts.PRACTICENAME))) 
        { 
         item.PracticeName = dataReader.GetString(PracticeSearchResultsLayouts.PRACTICENAME); 
        } 


        returnCollection.Add(item); 
       } 

       counter++; 
      } 

      return returnCollection; 

     } 
     //no catch here... see http://blogs.msdn.com/brada/archive/2004/12/03/274718.aspx 
     finally 
     { 
      if (!((dataReader == null))) 
      { 
       try 
       { 
        dataReader.Close(); /* very important */ /* note, if your datareader had MULTIPLE resultsets, you would not close it here */ 
       } 
       catch 
       { 
       } 
      } 
     } 
    } 
} 








namespace MedicalOffice 
{ 
    public class PracticeDataLayer 
    { 
     public ICollection<Practice> GetAllPractices() 
     { 
      using (SqlConnection cn = new SqlConnection()) 
      { 
       cn.ConnectionString = GetConnectionString(); 
       cn.Open(); 

       using (SqlCommand cmd = new SqlCommand("SelectPracticeID")) 
       { 
        cmd.Connection = cn; 
        cmd.CommandType = CommandType.StoredProcedure; 
        IDataReader idr = cmd.ExecuteReader(); 
        return new PracticeSerializer().SerializeCollection(idr); 
        //// idr.Close(); /* very important, currently the serializer closes it..so commented out here */ /* note, if your datareader had MULTIPLE resultsets, you would close the datareader AFTER you used all the resultsets */ 
       } 
      } 
     } 

     private string GetConnectionString() 
     { 
      string conString = ConfigurationManager.ConnectionStrings["MyConnString"].ConnectionString; 
      return conString; 
     } 
    } 
} 
相关问题