几个项目开发问题,有经验者请进。

huangwangman 2003-09-10 09:48:04
各位大侠:
我们手上有个项目马上要开工了,还有几个问题不太清楚,请各位帮忙解答:
1、ADO.Net中的几个对象sqlconnection , SqlDataAdaper, SqlDataReader, SqlCommand , DataSet ,感觉好象只有SqlConnection和SqlCommand就够了,其他的都有什么用?
2、在一个项目中连接SqlConnection是全局变量,其他的可以是全局的也可以设置成局部的,那么连接是作为AppSettings放在Web.Config中,还是放在Global.asx中(session_start里做session保存)?有什么区别嘛?
3、我以前对VB比较熟,请问在用VB.Net开发时,有对应的MessageBox之类的东西吗?
...全文
20 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
asam2183 2003-09-10
  • 打赏
  • 举报
回复
1.看你具体的运用情况来选定:SqlDataAdaper, SqlDataReader, SqlCommand
理解离线数据库的含义
2.在Global.asax中添加一健值:
Application.Add("DNS",ConfigurationSettings.AppSettings["DNS"] );
在Web.config中赋值:
<appSettings>
<add key="DNS",value="...">
</appSettings>
3.Web From 中没有,不过有人写过类似的控件
牛牛Alex 2003-09-10
  • 打赏
  • 举报
回复
MessageBox.Show 方法 [Visual Basic]请参见
MessageBox 类 | MessageBox 成员 | System.Windows.Forms 命名空间
语言
Visual Basic

显示消息框。

重载列表
显示具有指定文本的消息框。

[Visual Basic] Overloads Public Shared Function Show(String) As DialogResult
在指定对象的前面显示具有指定文本的消息框。

[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String) As DialogResult
显示具有指定文本和标题的消息框。

[Visual Basic] Overloads Public Shared Function Show(String, String) As DialogResult

在指定对象的前面显示具有指定文本和标题的消息框。

[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String, String) As DialogResult
显示具有指定文本、标题和按钮的消息框。

[Visual Basic] Overloads Public Shared Function Show(String, String, MessageBoxButtons) As DialogResult
在指定对象的前面显示具有指定文本、标题和按钮的消息框。

[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String, String, MessageBoxButtons) As DialogResult
显示具有指定文本、标题、按钮和图标的消息框。

[Visual Basic] Overloads Public Shared Function Show(String, String, MessageBoxButtons, MessageBoxIcon) As DialogResult
在指定对象的前面显示具有指定文本、标题、按钮和图标的消息框。

[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon) As DialogResult
显示具有指定文本、标题、按钮、图标和默认按钮的消息框。

[Visual Basic] Overloads Public Shared Function Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton) As DialogResult
在指定对象的前面显示具有指定文本、标题、按钮、图标和默认按钮的消息框。

[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton) As DialogResult
显示具有指定文本、标题、按钮、图标、默认按钮和选项的消息框。

[Visual Basic] Overloads Public Shared Function Show(String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions) As DialogResult
在指定对象的前面显示具有指定文本、标题、按钮、图标、默认按钮和选项的消息框。

[Visual Basic] Overloads Public Shared Function Show(IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton, MessageBoxOptions) As DialogResult
牛牛Alex 2003-09-10
  • 打赏
  • 举报
回复
MessageBox 类 [Visual Basic]请参见
MessageBox 成员 | System.Windows.Forms 命名空间 | Show
要求
命名空间: System.Windows.Forms

平台: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows .NET Server family

程序集: System.Windows.Forms (在 System.Windows.Forms.dll 中)
语言
C#

C++

JScript

Visual Basic

全部显示


显示可包含文本、按钮和符号(通知并指示用户)的消息框。

有关此类型所有成员的列表,请参阅 MessageBox 成员。

System.Object
System.Windows.Forms.MessageBox

[Visual Basic]
Public Class MessageBox
[C#]
public class MessageBox
[C++]
public __gc class MessageBox
[JScript]
public class MessageBox
线程安全
此类型的所有公共静态(Visual Basic 中为 Shared)成员对多线程操作而言都是安全的。但不保证任何实例成员是线程安全的。

备注
无法创建 MessageBox 类的新实例。若要显示消息框,请调用静态(在 Visual Basic 中为 Shared)方法 Show。显示在消息框中的标题、消息、按钮和图标由您传递给该方法的参数确定。

示例
[Visual Basic, C#] 下面的示例中说明通过使用 MessageBox 将 TextBox 中缺少的项通知用户。该示例假定从具有 Button 和 TextBox 的现有窗体调用此方法。

[Visual Basic]
Protected Sub button1_Click(sender As Object, e As System.EventArgs)
If textBox1.Text = "" Then
MessageBox.Show("You must enter a name.", "Name Entry Error", _
MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
' Code to act on the data entered would go here.
End If
End Sub
[C#]
protected void button1_Click(object sender, System.EventArgs e) {
if(textBox1.Text == "") {
MessageBox.Show("You must enter a name.", "Name Entry Error",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
else {
// Code to act on the data entered would go here.
}
}
[C++, JScript] 没有可用于 C++ 或 JScript 的示例。若要查看 Visual Basic 或 C# 示例,请单击页左上角的语言筛选器按钮 。

要求
命名空间: System.Windows.Forms

平台: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows .NET Server family

程序集: System.Windows.Forms (在 System.Windows.Forms.dll 中)
牛牛Alex 2003-09-10
  • 打赏
  • 举报
回复
动态属性和配置文件
当把属性设置为可配置时,它的值被写入配置文件,代码被插入该类,以便指示该属性值应从此外部资源中检索。配置文件根据应用程序的类型不同而不同;基于 Web 的应用程序使用 Web.config 文件,而基于 Windows 的应用程序则使用扩展名为 .config 的类似文件。一个应用程序中的所有窗体和组件都使用一个配置文件。不能在单个应用程序内切换到不同的配置文件或使用多个文件。

在配置文件内部,属性通过 XML 保持。例如,假设您指示数据连接的 ConnectionString 属性应该存储在配置文件中。您将在代码编辑器中看到如下代码,指示该值存储在外部:

' Visual Basic
Me.SqlConnection1.ConnectionString = CType(configurationAppSettings.GetValue("SqlConnection1.ConnectionString", GetType(System.String)), String)

// C#
this.sqlConnection1.ConnectionString = ((string)(configurationAppSettings.GetValue("sqlConnection1.ConnectionString", typeof(string))));
注意 有关创建安全数据连接的信息,请参阅数据库安全性。
在配置文件中,此属性的值将用在窗体代码中指示的键通过 XML 存储:

<configuration>
<appSettings>
<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />
</appSettings>
</configuration>
配置文件中的每个值都分配有一个键,用于存储和检索该值。键的起始部分指示该值从中产生的组件。例如,这两个键指示在一个应用程序内部两个不同的数据连接上的 ConnectionString 属性:

<configuration>
<appSettings>
<add key="sqlConnection1.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />
<add key="sqlConnection2.ConnectionString" value="data source=myserver;initial catalog=Apps;Integrated Security=SSPI;packet size=4096" />
</appSettings>
</configuration>
可以直接修改配置文件,以便在应用程序内动态更新属性值。应用程序下次启动时将更新这些值。

从某种意义上来说,配置文件类似于资源文件;它们都用于在已编译的应用程序外部存储值,它们都使用 XML 存储信息。但是,资源文件的用途和配置文件有很大差别。资源文件是出于翻译的目的用来存储字符串和其他可本地化的资源,而配置文件(就动态属性而言)是用于更新属性值。资源文件中的值是要翻译的,但通常不会更改,而配置文件中的动态属性值可以根据需要更改。此外,可以将多个资源文件与一个项目关联,但应用程序只能有一个配置文件。
RxitRose 2003-09-10
  • 打赏
  • 举报
回复
我有数据库操作类是用C#开发的做成组件了,你直接送SQL语句或储蓄过程就可以操作数据库了
很简单大大搞高了开发效率
qqrong1 2003-09-10
  • 打赏
  • 举报
回复
各有個的用處啊!
執行的效率不同啊!
SqlDataReader 高些
DataSet 低
但他們的使用功能就反了!
他們是你的開發更靈活!

牛牛Alex 2003-09-10
  • 打赏
  • 举报
回复
DataAdapter 的 Update 方法可调用来将 DataSet 中的更改解析回数据源。与 Fill 方法类似,Update 方法将 DataSet 的实例和可选的 DataTable 对象或 DataTable 名称用作参数。DataSet 实例是包含已作出的更改的 DataSet,而 DataTable 标识从其中检索更改的表。

当调用 Update 方法时,DataAdapter 将分析已作出的更改并执行相应的命令(INSERT、UPDATE 或 DELETE)。当 DataAdapter 遇到对 DataRow 的更改时,它将使用 InsertCommand、UpdateCommand 或 DeleteCommand 来处理该更改。这样,您就可以通过在设计时指定命令语法并在可能时通过使用存储过程来尽量提高 ADO.NET 应用程序的性能。在调用 Update 之前,必须显式设置这些命令。如果调用了 Update 但不存在用于特定更新的相应命令(例如,不存在用于已删除行的 DeleteCommand),则将引发异常。

Command 参数可用于为 DataSet 中每个已修改行的 SQL 语句或存储过程指定输入和输出值。有关更多信息,请参阅将参数用于 DataAdapter。

如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和 UpdateCommand。有关更多信息,请参阅自动生成的命令。

Update 方法会将更改解析回数据源,但是自上次填充 DataSet 以来,其他客户端可能已修改了数据源中的数据。若要使用当前数据刷新 DataSet,请再次使用 DataAdapter 填充 (Fill) DataSet。新行将添加到该表中,更新的信息将并入现有行。

若要处理可能在 Update 操作过程中发生的异常,可以使用 RowUpdated 事件在这些异常发生时响应行更新错误(请参阅使用 DataAdapter 事件),或者可以在调用 Update 之前将 DataAdapter.ContinueUpdateOnError 设置为 true,然后在 Update 完成时响应存储在特定行的 RowError 属性中的错误信息(请参阅添加和读取行错误信息)。

注意 如果对 DataSet、DataTable 或 DataRow 调用 AcceptChanges,则将使某 DataRow 的所有 Original 值被该 DataRow 的 Current 值改写。如果已修改将该行标识为唯一行的字段值,那么当调用 AcceptChanges 后,Original 值将不再匹配数据源中的值。
以下示例演示如何通过显式设置 DataAdapter 的 UpdateCommand 来执行对已修改行的更新。请注意,在 UPDATE 语句的 WHERE 子句中指定的参数设置为使用 SourceColumn 的 Original 值。这一点很重要,因为 Current 值可能已被修改,并且可能不匹配数据源中的值。Original 值是曾用来从数据源填充 DataTable 的值。

SqlClient
[Visual Basic]
Dim catDA As SqlDataAdapter = New SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn)

catDA.UpdateCommand = New SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " & _
"WHERE CategoryID = @CategoryID", nwindConn)

catDA.UpdateCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15, "CategoryName")

Dim workParm As SqlParameter = catDA.UpdateCommand.Parameters.Add("@CategoryID", SqlDbType.Int)
workParm.SourceColumn = "CategoryID"
workParm.SourceVersion = DataRowVersion.Original

Dim catDS As DataSet = New DataSet
catDA.Fill(catDS, "Categories")

Dim cRow As DataRow = catDS.Tables("Categories").Rows(0)
cRow("CategoryName") = "New Category"

catDA.Update(catDS)
[C#]
SqlDataAdapter catDA = new SqlDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn);

catDA.UpdateCommand = new SqlCommand("UPDATE Categories SET CategoryName = @CategoryName " +
"WHERE CategoryID = @CategoryID" , nwindConn);

catDA.UpdateCommand.Parameters.Add("@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");

SqlParameter workParm = catDA.UpdateCommand.Parameters.Add("@CategoryID", SqlDbType.Int);
workParm.SourceColumn = "CategoryID";
workParm.SourceVersion = DataRowVersion.Original;

DataSet catDS = new DataSet();
catDA.Fill(catDS, "Categories");

DataRow cRow = catDS.Tables["Categories"].Rows[0];
cRow["CategoryName"] = "New Category";

catDA.Update(catDS);
OleDb
[Visual Basic]
Dim catDA As OleDbDataAdapter = New OleDbDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn)

catDA.UpdateCommand = New OleDbCommand("UPDATE Categories SET CategoryName = ? " & _
"WHERE CategoryID = ?" , nwindConn)

catDA.UpdateCommand.Parameters.Add("@CategoryName", OleDbType.VarChar, 15, "CategoryName")

Dim workParm As OleDbParameter = catDA.UpdateCommand.Parameters.Add("@CategoryID", OleDbType.Integer)
workParm.SourceColumn = "CategoryID"
workParm.SourceVersion = DataRowVersion.Original

Dim catDS As DataSet = New DataSet
catDA.Fill(catDS, "Categories")

Dim cRow As DataRow = catDS.Tables("Categories").Rows(0)
cRow("CategoryName") = "New Category"

catDA.Update(catDS)
[C#]
OleDbDataAdapter catDA = new OleDbDataAdapter("SELECT CategoryID, CategoryName FROM Categories", nwindConn);

catDA.UpdateCommand = new OleDbCommand("UPDATE Categories SET CategoryName = ? " +
"WHERE CategoryID = ?" , nwindConn);

catDA.UpdateCommand.Parameters.Add("@CategoryName", OleDbType.VarChar, 15, "CategoryName");

OleDbParameter workParm = catDA.UpdateCommand.Parameters.Add("@CategoryID", OleDbType.Integer);
workParm.SourceColumn = "CategoryID";
workParm.SourceVersion = DataRowVersion.Original;

DataSet catDS = new DataSet();
catDA.Fill(catDS, "Categories");

DataRow cRow = catDS.Tables["Categories"].Rows[0];
cRow["CategoryName"] = "New Category";
catDA.Update(catDS);
自动递增列
如果来自数据源的表包含自动递增列,则可以使用由数据源生成的值填充 DataSet 中的列,方法是通过以存储过程输出参数的形式返回自动递增值并将其映射到表中的一列,或者使用 DataAdapter 的 RowUpdated 事件。有关示例,请参阅检索“标识”或“自动编号”值。

但是,DataSet 中的值可能会与数据源中的值不同步并导致意外的行为。例如,请考虑一个包含自动递增主键列 CustomerID 的表。如果在该 DataSet 中添加两个新客户,它们将收到自动递增的 CustomerId 值 1 和 2。在向 DataAdapter 的 Update 方法传递第二个客户行时,新添加的行会收到数据源中的自动递增 CustomerID 值 1,该值与 DataSet 中的值 2 不匹配。当 DataAdapter 使用返回值填充 DataSet 中的行时,由于第一个客户行的 CustomerID 已经是 1,因此将发生约束冲突。

为了避免这种行为,建议在使用数据源中的自动递增列和 DataSet 中的自动递增列时,在 DataSet 中创建 AutoIncrementStep 为 -1 且 AutoIncrementSeed 为 0 的列,并确保数据源生成从 1 开始并以正步长值递增的自动递增标识值。这样,DataSet 将为自动递增值生成负数,这些负数不会与数据源所生成的正自动递增值发生冲突。另一种方法是使用 Guid 类型的列而不是自动递增列。生成 Guid 值的算法在 DataSet 中生成的 Guid 从不会与数据源生成的 Guid 相同。有关定义 DataTable 中的列的更多信息,请参阅定义数据表的架构。

插入、更新和删除的排序
在许多情况下,以何种顺序向数据源发送通过 DataSet 作出的更改是相当重要的。例如,如果已更新现有行的主键值并且添加了具有新主键值的新行,则务必要在处理插入之前处理更新。

可以使用 DataTable 的 Select 方法来返回仅引用具有特定 RowState 的 DataRow 数组。然后可以将返回的 DataRow 数组传递到 DataAdapter 的 Update 方法来处理已修改的行。通过指定要更新的行的子集,可以控制处理插入、更新和删除的顺序。

例如,以下代码确保首先处理表中已删除的行,然后处理已更新的行,然后处理已插入的行。

[Visual Basic]
Dim updTable As DataTable = custDS.Tables("Customers")

' First process deletes.
custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.Deleted))

' Next process updates.
custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.ModifiedCurrent))

' Finally, process inserts.
custDA.Update(updTable.Select(Nothing, Nothing, DataViewRowState.Added))
[C#]
DataTable updTable = custDS.Tables["Customers"];

// First process deletes.
custDA.Update(updTable.Select(null, null, DataViewRowState.Deleted));

// Next process updates.
custDA.Update(updTable.Select(null, null, DataViewRowState.ModifiedCurrent));

// Finally, process inserts.
custDA.Update(updTable.Select(null, null, DataViewRowState.Added));
牛牛Alex 2003-09-10
  • 打赏
  • 举报
回复
当建立与数据源的连接后,可以使用 Command 对象来执行命令并从数据源中返回结果。您可以使用 Command 构造函数来创建命令,该构造函数采用在数据源、Connection 对象和 Transaction 对象中执行的 SQL 语句的可选参数。也可以使用 Connection 的 CreateCommand 方法来创建用于特定 Connection 对象的命令。您可以使用 CommandText 属性来查询和修改 Command 对象的 SQL 语句。

Command 对象公开了几个可用于执行所需操作的 Execute 方法。当以数据流的形式返回结果时,使用 ExecuteReader 可返回 DataReader 对象。使用 ExecuteScalar 可返回单个值。使用 ExecuteNonQuery 可执行不返回行的命令。

当您将 Command 对象用于存储过程时,可以将 Command 对象的 CommandType 属性设置为 StoredProcedure。当 CommandType 为 StoredProcedure 时,可以使用 Command 的 Parameters 属性来访问输入及输出参数和返回值。无论调用哪一个 Execute 方法,都可以访问 Parameters 属性。但是,当调用 ExecuteReader 时,在 DataReader 关闭之前,将无法访问返回值和输出参数。

以下代码示例演示如何设置 Command 对象的格式,以便从 Northwind 数据库中返回 Categories 的列表。

SqlClient
[Visual Basic]
Dim catCMD As SqlCommand = New SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn)
[C#]
SqlCommand catCMD = new SqlCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn);
OleDb
[Visual Basic]
Dim catCMD As OleDbCommand = New OleDbCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn)
[C#]
OleDbCommand catCMD = new OleDbCommand("SELECT CategoryID, CategoryName FROM Categories", nwindConn);
命令的性能计数器
SQL Server .NET 数据提供程序添加了一个性能计数器,它将使您能够检测与失败的命令执行相关的间歇性问题。若要确定因任何原因而失败的命令执行总次数,可以访问“.NET CLR 数据”性能对象下“性能监视器”中的“SqlClient:失败命令的总数”计数器。

牛牛Alex 2003-09-10
  • 打赏
  • 举报
回复
SQL Server .NET 数据提供程序使用 SqlConnection 对象提供了与 Microsoft SQL Server 版本 7.0 或更高版本的连接。

SQL Server .NET 数据提供程序支持类似于 OLE DB (ADO) 连接字符串格式的连接字符串格式。有关有效的字符串格式名称和值,请参阅 SqlConnection.ConnectionString 属性。

以下代码示例演示如何创建和打开与 SQL Server(版本 7.0 或更高版本)数据库的连接。

[Visual Basic]
Dim nwindConn As SqlConnection = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;" & _
"Initial Catalog=northwind")
nwindConn.Open()
[C#]
SqlConnection nwindConn = new SqlConnection("Data Source=localhost; Integrated Security=SSPI;" +
"Initial Catalog=northwind");
nwindConn.Open();
solo108 2003-09-10
  • 打赏
  • 举报
回复
1 基本同意楼上的兄弟,sqlconnection,sqlcommand确实可以满足大部分的需要,但sqldataadaper有时候也是很方便的,比如出列表的时候。dataset可以存数据,是脱机数据,用的也非常多。而且dataset不一定用来存储数据库的数据,也可以存储外部数据。
2 存在web.config中,随时可以更改,不用重起服务,这个大家都知道。
xhzuo 2003-09-10
  • 打赏
  • 举报
回复
还有一个效率的问题。
例如:如果只是向后读取数据,那么用SqlDataReader比较好
ETstudio 2003-09-10
  • 打赏
  • 举报
回复
1、SqlDataAdaper是填充一个dataset,可以很方便的到所有数据
SqlDataReader是一个记录一个记录读,可以控制所要的数据
DataSet可以是一个包含很多表的库,使用方便,具体用什么是个人习惯而已
2、可以放在Web.Config中
3、messagebox在winform里是有的

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧