C#从SQL Server数据库获取结果,通过类显示在组合框中
我对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
,每当你想调用存储过程可以使用这个类,它返回一个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
将持有已被你的数据库发送完整的信息
就个人而言,我不是Untyped(又名“松散”)DataTables和DataSet的粉丝。 – granadaCoder
我建议建立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;
}
}
}
您没有提问?但你的下一步将是从你的班级返回值。 'cmd.ExecuteNonQuery();'不会工作 - 您需要返回值。 – Jonesopolis
Webforms,winforms,MVC,WCF?你使用什么技术? – Liam
您调用存储来检索记录,但您没有对返回进行任何操作。例如,如果你得到一个datareader,你应该从那里读取记录。连接也没有关闭。网上有很多关于如何实现你想要实现的代码示例。 – derloopkat