新闻简介: 尽管ASP.NET提供了一个强壮的平台,但是开发者也不应忽视诸如JavaScript这样成熟的技术。在这篇文章中,Tony Patton将向您解释在Web开发中如何将JavaScript与ASP.NET控件进行整合。
尽管Web开发平台提供了灵活性和众多功能,您经常希望或需要依赖现有的技术来完成一项必须的任务,一个好的例子就是ASP.NET,它提供了一个强大的开发平台,但是同时也不应忽略像JavaScript这样成熟的技术,在这篇文章中,我将向您讲解如何将JavaScript代码联结到ASP.NET控件中。
常规方式
通常情况下,当一个Web应用软件需要一个弹出窗口或确认窗口或其它的客户端
关 键 词:
尽管ASP.NET提供了一个强壮的平台,但是开发者也不应忽视诸如JavaScript这样成熟的技术。在这篇文章中,Tony Patton将向您解释在Web开发中如何将JavaScript与ASP.NET控件进行整合。
尽管Web开发平台提供了灵活性和众多功能,您经常希望或需要依赖现有的技术来完成一项必须的任务,一个好的例子就是ASP.NET,它提供了一个强大的开发平台,但是同时也不应忽略像JavaScript这样成熟的技术,在这篇文章中,我将向您讲解如何将JavaScript代码联结到ASP.NET控件中。
常规方式
通常情况下,当一个Web应用软件需要一个弹出窗口或确认窗口或其它的客户端功能时,您可以创建必需的JavaScript方法,并在需要时调用它们。例如,在列表A中包含了一个确认窗口,用户可以用它来继续或取消表单的提交。
在选择了提交(submit)按钮之后,JavaScript的confirmSubmit方法就被调用了,这一确认提示允许用户继续进行表单提交(选择确认)或取消(选择取消)。
以上代码可以按照计划工作,但是在一个开发平台上工作的时候就没有这么简单了,比如ASP.NET。
ASP.NET的替换选项
ASP.NET支持使用诸如输入按钮和文本框等HTML元素,但是在ASP.NET自己的开发模型上有一套完成的控件元素可以提供额外的功能。
将JavaScript附加到ASP.NET上并不像直接的HTML/JavaScript方式那么简单,ASP.NET编程模式在基本页面类中提供了方法来附加脚本程序块到页面元素当中。以下的方法可以用于附加或整合JavaScript到页面或页面元素中:
RegisterClientScriptBlock:允许您的页面含有脚本程序块,客户端脚本在页面对象form runat= server>元素的起始标签之后开始运行,脚本程序块是作为对象来提交输出的,所以您必需加上两个script>元素标签。
RegisterOnSubmitStatement:允许您指派一个脚本程序块/方法到页面对象OnSubmit事件上。
RegisterStartupScript:允许您在页面中包含脚本程序块,与RegisterClientScriptBlock方法类似,这一方法在页面对象form runat= server>元素的结束标签之前开始运行,脚本程序块是作为对象来提交输出的,所以您必需加上两个script>元素标签。
每个方法都可以接受两个参数:键和脚本,键是分配给脚本程序块的名称,键值应当是唯一的,通过这一唯一的键值,多个服务器控制的实例可以请求脚本程序块,而不必让脚本再次运行输出流;第二个参数脚本包含了发送到客户的实际脚本,它可以是完整的JavaScript代码或一个方法的名称。
这些方法可以使用在实际的ASP.NET页面代码中,无论是VB.NET、C#、J#或任何其它的语言,列表B展示了用C#编写的ASP.NET示例代码。
JavaScript方法是通过一个字符串变量来构建的,它的值传递给RegisterClientScriptBlock方法作为第二个参数,实际的方法名称是通过该对象的Attributes 属性的Add方法来分配给ASP.NET的按钮控件的,JavaScript事件是作为第一个参数传递的,而方法名称则是第二个参数。
而且,你可能会注意到IsStartupScriptRegistered方法的使用,该方法允许您在继续使用前确认该脚本是否已经被注册了,有两个方法可以用于这个问题:
IsStartupScriptRegistered:确认客户端的起始脚本是否已经在页面对象上注册,其单一参数是脚本的名称。
IsClientScriptBlockRegistered:确认客户端的脚本程序块是否已经在页面对象上注册,其唯一的参数是脚本的名称。
另一个解决问题的方法就是使用页面类的RegisterOnSubmitStatement方法,列表C重复了列表B的功能,但是不同之处在于将confirmSubmit方法连接到页面的提交事件上而不是按钮的点击事件上。
这个简单的例子清晰地说明了如何将JavaScript脚本程序块和JavaScript脚本包含到ASP.NET页面的控件上,如果您使用ASP.NET控件,这种方法可以帮助您将脚本联系到这些控件上,但是也可以使用注册(register)方法来集中一个项目的JavaScript。您可以创建一个包含了脚本的类文件并在需要时在页面中使用它们,这样就只需在一个位置对这些脚本进行管理,在一个应用软件中的一个或多个页面上使用这些脚本就会变得更容易。
集新旧于一身
无论在哪种开发平台,您都不太可能放弃使用JavaScript作为客户端脚本语言,JavaScript都是开发客户端功能的标准,尽管ASP.NET控件提供了大量的功能,很多时候您还需要将JavaScript与这些控件进行“联姻”,幸好ASP.NET页面类包含了众多的方法来将脚本程序块和方法集成到页面及其控件上。
2009年4月16日星期四
vb.net调用存储过程实例
vb.net调用存储过程实例
create proc pro_bschk @strRq1 varchar(10),@strRq2 varchar(10) as
select DISTINCT column_order=SUBSTRING(BSCDM,1,2),
column0=MARKET_NAME,
column1=sum(CJJE),
column2=sum(DDJE)
from BSCHK,BSCDA where CONVERT(CHAR(10),DATE,102)>=@strRq1 and CONVERT(CHAR(10),DATE,102)<=@strRq2 and SUBSTRING(BSCDM,1,2)=MARKET_ID
group by SUBSTRING(BSCDM,1,2),MARKET_NAME
代码﹕
Public Function CreateDsFromProc(ByVal strProc As String, ByVal strRq1 As String, ByVal strRq2 As String) As DataSet
Dim ds As New DataSet
Dim cmd As Odbc.OdbcCommand
Dim da As New OdbcDataAdapter
cmd = New OdbcCommand(strProc, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@strRq1", OdbcType.VarChar, 10)
cmd.Parameters.Add("@strRq2", OdbcType.VarChar, 10)
cmd.Parameters(0).Value = strRq1
cmd.Parameters(1).Value = strRq2
da.SelectCommand = cmd
da.Fill(ds)
If ds.Tables(0).Rows.Count >= 1 Then
Return ds
Else
Return Nothing
End If
End Function
create proc pro_bschk @strRq1 varchar(10),@strRq2 varchar(10) as
select DISTINCT column_order=SUBSTRING(BSCDM,1,2),
column0=MARKET_NAME,
column1=sum(CJJE),
column2=sum(DDJE)
from BSCHK,BSCDA where CONVERT(CHAR(10),DATE,102)>=@strRq1 and CONVERT(CHAR(10),DATE,102)<=@strRq2 and SUBSTRING(BSCDM,1,2)=MARKET_ID
group by SUBSTRING(BSCDM,1,2),MARKET_NAME
代码﹕
Public Function CreateDsFromProc(ByVal strProc As String, ByVal strRq1 As String, ByVal strRq2 As String) As DataSet
Dim ds As New DataSet
Dim cmd As Odbc.OdbcCommand
Dim da As New OdbcDataAdapter
cmd = New OdbcCommand(strProc, cn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@strRq1", OdbcType.VarChar, 10)
cmd.Parameters.Add("@strRq2", OdbcType.VarChar, 10)
cmd.Parameters(0).Value = strRq1
cmd.Parameters(1).Value = strRq2
da.SelectCommand = cmd
da.Fill(ds)
If ds.Tables(0).Rows.Count >= 1 Then
Return ds
Else
Return Nothing
End If
End Function
VB.NET操作SQL Server完全模块
Module ModSql
Function GetIntByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetIntByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetStrByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As String
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As String = ""
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), "", sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return Trim(rowsAffected)
End Function
Function GetStrByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As String
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As String = ""
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), "", sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return Trim(rowsAffected)
End Function
Function GetBitByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As Boolean
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Boolean = False
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), False, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetBitByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As Boolean
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Boolean = False
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), False, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetDateByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As DateTime
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As DateTime
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), DateAdd(DateInterval.Year, -100, Date.Now), sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetDateByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As DateTime
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As DateTime
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), DateAdd(DateInterval.Year, -100, Date.Now), sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function DelByInt(ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "DELETE FROM " & TableName & " WHERE " & ParaName & " =" & ParaValue
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function DelByStr(ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "DELETE FROM " & TableName & " WHERE " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function DelBySQL(ByVal StrSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = StrSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateBitBySQL(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Boolean, ByVal ParaSQL As String) As String
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & IIf(DataFieldValue = True, 1, 0) & " WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
sqlConnection.Open()
Try
sqlCommand.ExecuteNonQuery()
Return ""
Catch ex As Exception
Return ex.Message
Finally
sqlConnection.Close()
End Try
End Function
Function UpdateStrByInt(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As String, ByVal Para As String, ByVal ParaValue As Integer) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = '" & DataFieldValue & "' WHERE " & Para & " = " & ParaValue
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateStrByStr(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As String, ByVal Para As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = '" & DataFieldValue & "' WHERE " & Para & " = '" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateIntByInt(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Integer, ByVal Para As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & DataFieldValue & " WHERE " & Para & " = " & ParaValue
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateIntByStr(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Integer, ByVal Para As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & DataFieldValue & " WHERE " & Para & " = '" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateIntBySQL(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Integer, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & DataFieldValue & " WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateStrBySQL(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = '" & DataFieldValue & "' WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateBySQL(ByVal TableName As String, ByVal SetSQL As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & SetSQL & " WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetDataTableByFormat(ByVal vRecordNumber As Integer, ByVal ItemSQL As String, ByVal TableName As String, ByVal ParaSQL As String) As System.Data.DataTable
Dim RecordNumber As String
If vRecordNumber = 0 Then
RecordNumber = ""
Else
RecordNumber = "TOP " & vRecordNumber
End If
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT " & RecordNumber & " " & ItemSQL & " FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim dataAdapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(sqlCommand)
Dim DataSet As System.Data.DataSet = New System.Data.DataSet
Try
dataAdapter.Fill(dataSet)
Return dataSet.Tables(0)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
End Function
Function GetDataTableBySQL(ByVal SuperSQL As String) As System.Data.DataTable
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(SuperSQL, sqlConnection)
Dim dataAdapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(sqlCommand)
Dim dataSet As System.Data.DataSet = New System.Data.DataSet
Try
dataAdapter.Fill(dataSet)
Return dataSet.Tables(0)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
End Function
Function GetMaxField(ByVal TableName As String, ByVal FieldName As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT MAX(" & FieldName & ") AS MaxField FROM " & TableName
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetMinField(ByVal TableName As String, ByVal FieldName As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT Min(" & FieldName & ") AS MaxField FROM " & TableName
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetFieldCount(ByVal TableName As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT COUNT(*) AS FieldCount FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteScalar
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetFieldSumByInt(ByVal TableName As String, ByVal FieldName As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT isnull(sum(" & FieldName & "),0) AS CountNumber FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteScalar
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetFieldSumByDec(ByVal TableName As String, ByVal FieldName As String, ByVal ParaSQL As String) As Decimal
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT isnull(sum(" & FieldName & "),0) AS CountNumber FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Decimal
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteScalar
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function ChgFieldByLeftWord(ByVal TableName As String, ByVal FieldName As String, ByVal ParaWord As String, ByVal NewWord As String) As Integer
Try
Return UpdateBySQL(TableName, FieldName & "='" & NewWord & "'+right(" & FieldName & ",len(" & FieldName & ")-" & Len(ParaWord) & ")", "Len(" & FieldName & ")>=" & Len(ParaWord) & " and left(" & FieldName & "," & Len(ParaWord) & ")='" & ParaWord & "'")
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
End Try
End Function
'数据库连接串
Private Function GetConn() As String
Return "server=localhost;database=pubs;uid=sa;pwd="
End Function
End Module
Function GetIntByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetIntByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetStrByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As String
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As String = ""
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), "", sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return Trim(rowsAffected)
End Function
Function GetStrByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As String
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As String = ""
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), "", sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return Trim(rowsAffected)
End Function
Function GetBitByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As Boolean
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Boolean = False
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), False, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetBitByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As Boolean
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Boolean = False
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), False, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetDateByInt(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As DateTime
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "=" & ParaValue & ""
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As DateTime
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), DateAdd(DateInterval.Year, -100, Date.Now), sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetDateByStr(ByVal FieldName As String, ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As DateTime
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "select Top 1 " & FieldName & " from " & TableName & " where " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As DateTime
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), DateAdd(DateInterval.Year, -100, Date.Now), sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function DelByInt(ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As Integer) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "DELETE FROM " & TableName & " WHERE " & ParaName & " =" & ParaValue
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function DelByStr(ByVal TableName As String, ByVal ParaName As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "DELETE FROM " & TableName & " WHERE " & ParaName & "='" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function DelBySQL(ByVal StrSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = StrSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateBitBySQL(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Boolean, ByVal ParaSQL As String) As String
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & IIf(DataFieldValue = True, 1, 0) & " WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
sqlConnection.Open()
Try
sqlCommand.ExecuteNonQuery()
Return ""
Catch ex As Exception
Return ex.Message
Finally
sqlConnection.Close()
End Try
End Function
Function UpdateStrByInt(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As String, ByVal Para As String, ByVal ParaValue As Integer) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = '" & DataFieldValue & "' WHERE " & Para & " = " & ParaValue
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateStrByStr(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As String, ByVal Para As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = '" & DataFieldValue & "' WHERE " & Para & " = '" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateIntByInt(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Integer, ByVal Para As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & DataFieldValue & " WHERE " & Para & " = " & ParaValue
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateIntByStr(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Integer, ByVal Para As String, ByVal ParaValue As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & DataFieldValue & " WHERE " & Para & " = '" & ParaValue & "'"
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateIntBySQL(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As Integer, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = " & DataFieldValue & " WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateStrBySQL(ByVal TableName As String, ByVal DataFieldName As String, ByVal DataFieldValue As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & DataFieldName & " = '" & DataFieldValue & "' WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function UpdateBySQL(ByVal TableName As String, ByVal SetSQL As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "UPDATE " & TableName & " SET " & SetSQL & " WHERE " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteNonQuery
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetDataTableByFormat(ByVal vRecordNumber As Integer, ByVal ItemSQL As String, ByVal TableName As String, ByVal ParaSQL As String) As System.Data.DataTable
Dim RecordNumber As String
If vRecordNumber = 0 Then
RecordNumber = ""
Else
RecordNumber = "TOP " & vRecordNumber
End If
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT " & RecordNumber & " " & ItemSQL & " FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim dataAdapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(sqlCommand)
Dim DataSet As System.Data.DataSet = New System.Data.DataSet
Try
dataAdapter.Fill(dataSet)
Return dataSet.Tables(0)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
End Function
Function GetDataTableBySQL(ByVal SuperSQL As String) As System.Data.DataTable
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(SuperSQL, sqlConnection)
Dim dataAdapter As System.Data.SqlClient.SqlDataAdapter = New System.Data.SqlClient.SqlDataAdapter(sqlCommand)
Dim dataSet As System.Data.DataSet = New System.Data.DataSet
Try
dataAdapter.Fill(dataSet)
Return dataSet.Tables(0)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
End Function
Function GetMaxField(ByVal TableName As String, ByVal FieldName As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT MAX(" & FieldName & ") AS MaxField FROM " & TableName
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetMinField(ByVal TableName As String, ByVal FieldName As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT Min(" & FieldName & ") AS MaxField FROM " & TableName
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer = 0
sqlConnection.Open()
Try
rowsAffected = IIf(IsDBNull(sqlCommand.ExecuteScalar), 0, sqlCommand.ExecuteScalar)
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetFieldCount(ByVal TableName As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT COUNT(*) AS FieldCount FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteScalar
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetFieldSumByInt(ByVal TableName As String, ByVal FieldName As String, ByVal ParaSQL As String) As Integer
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT isnull(sum(" & FieldName & "),0) AS CountNumber FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Integer
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteScalar
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function GetFieldSumByDec(ByVal TableName As String, ByVal FieldName As String, ByVal ParaSQL As String) As Decimal
Dim sqlConnection As New SqlClient.SqlConnection(GetConn)
Dim queryString As String = "SELECT isnull(sum(" & FieldName & "),0) AS CountNumber FROM " & TableName & " where " & ParaSQL
Dim sqlCommand As System.Data.SqlClient.SqlCommand = New System.Data.SqlClient.SqlCommand(queryString, sqlConnection)
Dim rowsAffected As Decimal
sqlConnection.Open()
Try
rowsAffected = sqlCommand.ExecuteScalar
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
Finally
sqlConnection.Close()
End Try
Return rowsAffected
End Function
Function ChgFieldByLeftWord(ByVal TableName As String, ByVal FieldName As String, ByVal ParaWord As String, ByVal NewWord As String) As Integer
Try
Return UpdateBySQL(TableName, FieldName & "='" & NewWord & "'+right(" & FieldName & ",len(" & FieldName & ")-" & Len(ParaWord) & ")", "Len(" & FieldName & ")>=" & Len(ParaWord) & " and left(" & FieldName & "," & Len(ParaWord) & ")='" & ParaWord & "'")
Catch ex As Exception
Throw New NotSupportedException(ex.Message)
End Try
End Function
'数据库连接串
Private Function GetConn() As String
Return "server=localhost;database=pubs;uid=sa;pwd="
End Function
End Module
如何将Access导入到SQL2005
SQL Server 导入和导出向导提供了生成 Microsoft SQL Server 2005 Integration Services (SSIS) 包最简单的方法。SQL Server 导入和导出向导可以访问各种数据源。可以向下列源复制数据或从其中复制数据:
·Microsoft SQL Server
·文本文件
·Microsoft Office Access
·Microsoft Office Excel
·其他 OLE DB 访问接口
此外,可以只使用 ADO.NET 访问接口和 ODBC 数据源作为源。
启动 SQL Server 导入和导出向导
在 Business Intelligence Development Studio 中,右键单击“SSIS 包”文件夹,再单击“SSIS 导入和导出向导”。
- 或 -
在 Business Intelligence Development Studio 中的“项目”菜单上,单击“SSIS 导入和导出向导”。
- 或 -
在 SQL Server Management Studio 中,连接到数据库引擎服务器类型,展开数据库,右键单击一个数据库,指向“任务”,再单击“导入数据”或“导出数据”。
- 或 -
在命令提示符窗口中运行 DTSWizard.exe(位于 C:\Program Files\Microsoft SQL Server\90\DTS\Binn)。
方法二:
执行 sql 查询:
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
INSERT INTO 表名(字段1,字段2,字段3)
SELECT 字段1,字段2,字段3
FROM opendatasource( 'Microsoft.Jet.OLEDB.4.0',’Data Source="d:\Ilovedezai.mdb";Jet
OLEDB:Database Password=密码')...表名
·Microsoft SQL Server
·文本文件
·Microsoft Office Access
·Microsoft Office Excel
·其他 OLE DB 访问接口
此外,可以只使用 ADO.NET 访问接口和 ODBC 数据源作为源。
启动 SQL Server 导入和导出向导
在 Business Intelligence Development Studio 中,右键单击“SSIS 包”文件夹,再单击“SSIS 导入和导出向导”。
- 或 -
在 Business Intelligence Development Studio 中的“项目”菜单上,单击“SSIS 导入和导出向导”。
- 或 -
在 SQL Server Management Studio 中,连接到数据库引擎服务器类型,展开数据库,右键单击一个数据库,指向“任务”,再单击“导入数据”或“导出数据”。
- 或 -
在命令提示符窗口中运行 DTSWizard.exe(位于 C:\Program Files\Microsoft SQL Server\90\DTS\Binn)。
方法二:
执行 sql 查询:
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
INSERT INTO 表名(字段1,字段2,字段3)
SELECT 字段1,字段2,字段3
FROM opendatasource( 'Microsoft.Jet.OLEDB.4.0',’Data Source="d:\Ilovedezai.mdb";Jet
OLEDB:Database Password=密码')...表名
2009年4月9日星期四
ASP+Access的安全隐患及对策
随着Internet的发展,Web技术日新月异。继通用网关接口(CGI)之后,“ASP”(Active Server Pages)作为一种典型的服务器端网页设计技术,被广泛地应用在网上银行、电子商务、搜索引擎等各种互联网应用中。同时Access数据库作为微软推出的以标准JET为引擎的桌面型数据库系统,由于具有操作简单、界面友好等特点,具有较大的用户群体。因此ASP+Access成为许多中小型网上应用系统的首选方案。但ASP+Access解决方案在为我们带来便捷的同时,也带来了不容忽视的安全问题。
ASP+Access的安全隐患
ASP+Access解决方案的主要安全隐患来自Access数据库的安全性,其次在于ASP网页设计过程中的安全漏洞。
1.Access数据库的存储隐患
在ASP+Access应用系统中,如果获得或者猜到Access数据库的存储路径和数据库名,则该数据库就可以被下载到本地。例如:对于网上书店的Access数据库,人们一般命名为book.mdb、store.mdb等,而存储的路径一般为“URL/database”或干脆放在根目录(“URL/”)下。这样,只要在浏览器地址栏中敲入地址:“URL/database/store.mdb”,就可以轻易地把store.mdb下载到本地的机器中。
2.Access数据库的解密隐患
由于Access数据库的加密机制非常简单,所以即使数据库设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行异或来形成一个加密串,并将其存储在*.mdb文件中从地址“&H42”开始的区域内。由于异或操作的特点是“经过两次异或就恢复原值”,因此,用这一密钥与*.mdb文件中的加密串进行第二次异或操作,就可以轻松地得到Access数据库的密码。基于这种原理,可以很容易地编制出解密程序。
由此可见,无论是否设置了数据库密码,只要数据库被下载,其信息就没有任何安全性可言了。
3.源代码的安全隐患
由于ASP程序采用的是非编译性语言,这大大降低了程序源代码的安全性。任何人只要进入站点,就可以获得源代码,从而造成ASP应用程序源代码的泄露。
4.程序设计中的安全隐患
ASP代码利用表单(form)实现与用户交互的功能,而相应的内容会反映在浏览器的地址栏中,如果不采用适当的安全措施,只要记下这些内容,就可以绕过验证直接进入某一页面。例如在浏览器中敲入“……page.asp?x=1”,即可不经过表单页面直接进入满足“x=1”条件的页面。因此,在设计验证或注册页面时,必须采取特殊措施来避免此类问题的发生。
提高数据库的安全性
由于Access数据库加密机制过于简单,因此,如何有效地防止Access数据库被下载,就成了提高ASP+Access解决方案安全性的重中之重。
1.非常规命名法
防止数据库被找到的简便方法是为Access数据库文件起一个复杂的非常规名字,并把它存放在多层目录下。例如,对于网上书店的数据库文件,不要简单地命名为“book.mdb”或“store.mdb”,而是要起个非常规的名字,例如:faq19jhsvzbal.mdb,再把它放在如./akkjj16t/kjhgb661/acd/avccx55 之类的深层目录下。这样,对于一些通过猜的方式得到Access数据库文件名的非法访问方法起到了有效的阻止作用。
2.使用ODBC数据源
在ASP程序设计中,应尽量使用ODBC数据源,不要把数据库名直接写在程序中,否则,数据库名将随ASP源代码的失密而一同失密。例如:
DBPath = Server.MapPath(“./akkjj16t/
kjhgb661/acd/avccx55/faq19jhsvzbal.mdb ”)
conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=” & DBPath
可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,数据库也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了:
conn.open “ODBC-DSN名”
对ASP页面进行加密
为有效地防止ASP源代码泄露,可以对ASP页面进行加密。一般有两种方法对ASP页面进行加密。一种是使用组件技术将编程逻辑封装入DLL之中;另一种是使用微软的Script Encoder对ASP页面进行加密。笔者认为,使用组件技术存在的主要问题是每段代码均需组件化,操作比较烦琐,工作量较大;而使用Script Encoder对ASP页面进行加密,操作简单、收效良好。Script Encoder方法具有许多优点:
1.HTML仍具有很好的可编辑性。Script Encoder只加密在HTML页面中嵌入的ASP代码,其他部分仍保持不变,这就使得我们仍然可以使用FrontPage或Dreamweaver等常用网页编辑工具对HTML部分进行修改、完善,只是不能对ASP加密部分进行修改,否则将导致文件失效。
2.操作简单。只要掌握几个命令行参数即可。Script Encoder的运行程序是screnc.exe,其使用方法如下:
screnc [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile
其中的参数含义如下:
s:屏蔽屏幕输出;
f:指定输出文件是否覆盖同名输入文件;
xl:是否在.asp文件的顶部添加@Language指令;
l:defLanguag指定缺省的脚本语言;
e:defExtension 指定待加密文件的扩展名。
3.可以批量加密文件。使用Script Encoder可以对当前目录中的所有的ASP 文件进行加密,并把加密后的文件统一输出到相应的目录中。例如:
screnc *.asp c:\\temp
4. Script Encoder是免费软件。该加密软件可以从微软网站下载:http://msdn.microsoft.com/scripting/vbscript/download/x86/sce10en.exe。下载后,运行安装即可。
利用Session对象进行注册验证
为防止未经注册的用户绕过注册界面直接进入应用系统,可以采用Session对象进行注册验证。Session对象最大的优点是可以把某用户的信息保留下来,让后续的网页读取。例如,要设计如图1所示的注册页面。
图1 注册页面
设计要求用户注册成功后系统启动hrmis.asp?page=1页面。如果不采用Session对象进行注册验证,则用户在浏览器中敲入“URL/hrmis.asp?page=1”即可绕过注册界面,直接进入系统。利用Session对象可以有效阻止这一情况的发生。相关的程序代码如下:
<%
@# 读取用户输入的账号和密码
UserID = Request(“UserID”)
Password = Request(“Password”)
@# 检查UserID 及Password 是否正确(实际程序可能会比较复杂)
If UserID <>“hrmis” Or Password <>
“password” Then
Response.Write “账号错误!”
Response.End
End If
@#将Session 对象设置为通过验证状态
Session(“Passed”) = True
%>
进入应用程序后,首先进行验证:
<%
@#如果未通过验证,返回Login状态
If Not Session(“Passed”) Then
Response.Redirect “Login.asp”
End If
%>
ASP+Access的安全隐患
ASP+Access解决方案的主要安全隐患来自Access数据库的安全性,其次在于ASP网页设计过程中的安全漏洞。
1.Access数据库的存储隐患
在ASP+Access应用系统中,如果获得或者猜到Access数据库的存储路径和数据库名,则该数据库就可以被下载到本地。例如:对于网上书店的Access数据库,人们一般命名为book.mdb、store.mdb等,而存储的路径一般为“URL/database”或干脆放在根目录(“URL/”)下。这样,只要在浏览器地址栏中敲入地址:“URL/database/store.mdb”,就可以轻易地把store.mdb下载到本地的机器中。
2.Access数据库的解密隐患
由于Access数据库的加密机制非常简单,所以即使数据库设置了密码,解密也很容易。该数据库系统通过将用户输入的密码与某一固定密钥进行异或来形成一个加密串,并将其存储在*.mdb文件中从地址“&H42”开始的区域内。由于异或操作的特点是“经过两次异或就恢复原值”,因此,用这一密钥与*.mdb文件中的加密串进行第二次异或操作,就可以轻松地得到Access数据库的密码。基于这种原理,可以很容易地编制出解密程序。
由此可见,无论是否设置了数据库密码,只要数据库被下载,其信息就没有任何安全性可言了。
3.源代码的安全隐患
由于ASP程序采用的是非编译性语言,这大大降低了程序源代码的安全性。任何人只要进入站点,就可以获得源代码,从而造成ASP应用程序源代码的泄露。
4.程序设计中的安全隐患
ASP代码利用表单(form)实现与用户交互的功能,而相应的内容会反映在浏览器的地址栏中,如果不采用适当的安全措施,只要记下这些内容,就可以绕过验证直接进入某一页面。例如在浏览器中敲入“……page.asp?x=1”,即可不经过表单页面直接进入满足“x=1”条件的页面。因此,在设计验证或注册页面时,必须采取特殊措施来避免此类问题的发生。
提高数据库的安全性
由于Access数据库加密机制过于简单,因此,如何有效地防止Access数据库被下载,就成了提高ASP+Access解决方案安全性的重中之重。
1.非常规命名法
防止数据库被找到的简便方法是为Access数据库文件起一个复杂的非常规名字,并把它存放在多层目录下。例如,对于网上书店的数据库文件,不要简单地命名为“book.mdb”或“store.mdb”,而是要起个非常规的名字,例如:faq19jhsvzbal.mdb,再把它放在如./akkjj16t/kjhgb661/acd/avccx55 之类的深层目录下。这样,对于一些通过猜的方式得到Access数据库文件名的非法访问方法起到了有效的阻止作用。
2.使用ODBC数据源
在ASP程序设计中,应尽量使用ODBC数据源,不要把数据库名直接写在程序中,否则,数据库名将随ASP源代码的失密而一同失密。例如:
DBPath = Server.MapPath(“./akkjj16t/
kjhgb661/acd/avccx55/faq19jhsvzbal.mdb ”)
conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=” & DBPath
可见,即使数据库名字起得再怪异,隐藏的目录再深,ASP源代码失密后,数据库也很容易被下载下来。如果使用ODBC数据源,就不会存在这样的问题了:
conn.open “ODBC-DSN名”
对ASP页面进行加密
为有效地防止ASP源代码泄露,可以对ASP页面进行加密。一般有两种方法对ASP页面进行加密。一种是使用组件技术将编程逻辑封装入DLL之中;另一种是使用微软的Script Encoder对ASP页面进行加密。笔者认为,使用组件技术存在的主要问题是每段代码均需组件化,操作比较烦琐,工作量较大;而使用Script Encoder对ASP页面进行加密,操作简单、收效良好。Script Encoder方法具有许多优点:
1.HTML仍具有很好的可编辑性。Script Encoder只加密在HTML页面中嵌入的ASP代码,其他部分仍保持不变,这就使得我们仍然可以使用FrontPage或Dreamweaver等常用网页编辑工具对HTML部分进行修改、完善,只是不能对ASP加密部分进行修改,否则将导致文件失效。
2.操作简单。只要掌握几个命令行参数即可。Script Encoder的运行程序是screnc.exe,其使用方法如下:
screnc [/s] [/f] [/xl] [/l defLanguage ] [/e defExtension] inputfile outputfile
其中的参数含义如下:
s:屏蔽屏幕输出;
f:指定输出文件是否覆盖同名输入文件;
xl:是否在.asp文件的顶部添加@Language指令;
l:defLanguag指定缺省的脚本语言;
e:defExtension 指定待加密文件的扩展名。
3.可以批量加密文件。使用Script Encoder可以对当前目录中的所有的ASP 文件进行加密,并把加密后的文件统一输出到相应的目录中。例如:
screnc *.asp c:\\temp
4. Script Encoder是免费软件。该加密软件可以从微软网站下载:http://msdn.microsoft.com/scripting/vbscript/download/x86/sce10en.exe。下载后,运行安装即可。
利用Session对象进行注册验证
为防止未经注册的用户绕过注册界面直接进入应用系统,可以采用Session对象进行注册验证。Session对象最大的优点是可以把某用户的信息保留下来,让后续的网页读取。例如,要设计如图1所示的注册页面。
图1 注册页面
设计要求用户注册成功后系统启动hrmis.asp?page=1页面。如果不采用Session对象进行注册验证,则用户在浏览器中敲入“URL/hrmis.asp?page=1”即可绕过注册界面,直接进入系统。利用Session对象可以有效阻止这一情况的发生。相关的程序代码如下:
<%
@# 读取用户输入的账号和密码
UserID = Request(“UserID”)
Password = Request(“Password”)
@# 检查UserID 及Password 是否正确(实际程序可能会比较复杂)
If UserID <>“hrmis” Or Password <>
“password” Then
Response.Write “账号错误!”
Response.End
End If
@#将Session 对象设置为通过验证状态
Session(“Passed”) = True
%>
进入应用程序后,首先进行验证:
<%
@#如果未通过验证,返回Login状态
If Not Session(“Passed”) Then
Response.Redirect “Login.asp”
End If
%>
vb.net的Button控件
Button(按钮)控件一般接受鼠标单击事件被用来启动、中断或结束一个进程(相当于Visual Basic以前版本的CommandButton控件)。单击Button控件时将调用已写入Click事件过程中的过程。Button控件在大多数Visual Basic应用程序中都会用到,用户可以单击按钮执行操作。单击时,按钮不仅能执行相应的操作,而且看起来与被按下和松开一样。Button控件在工具箱中的图标如图所示:
1.向窗体添加按钮
在应用程序中很可能要使用多个按钮。就象在其他容器控件上绘制按钮那样,从工具箱里把Button控件直接拖到窗体上即可。可用鼠标调整按钮的大小,也可通过设置Location(坐标,用来确定控件相对窗体左上方顶点的位置)和Size(大小,第一个参数代表宽度,第二个参数代表高度)属性进行调整。
2.设置按钮显示文本
可用Text属性改变按钮上显示的文本。设计时,可在控件的“属性窗口”中设置此属性。在设计时设置Text属性后将动态更新按钮文本。Text属性最多包含255个字符。若标题超过了命令按钮的宽度,则会折到下一行。但是,如果控件无法容纳其全部长度,则标题会被剪切。可以通过设置Font属性改变在命令按钮上显示的字体。
3.创建键盘快捷方式
可通过Text属性创建按钮的访问键快捷方式。为此,只需在作为访问键的字母前添加一个连字符(&)。例如,要为标题“Ok”创建访问键,应在字母“O”前添中连字符,于是得到“&Ok”。运行时,字母“O”将带下划线,同时按Alt+O键就可执行单击按钮程序所执行的动作。
注意:如果不创建访问键,而又要使标题中包含连字符,应添加两个连字符(&&)。这样,在标题中就只显示一个连字符。
4.选定按钮
运行时,可用鼠标或键盘通过下述方法选定按钮:
(1)用鼠标单击按钮;
(2)按Tab键,将焦点转移到按钮上,然后按Enter键选定按钮;
(3)按按钮的访问键([Alt+带有下划线的字母])。
5.Click事件
运行时单击按钮,将触发按钮的Click事件并执行写入Click事件过程中的代码,同时,单击按钮的过程也将生成MouseMove、MouseLeave、MouseDown和MouseUp等事件。如果要在这些相关事件中附加事件过程,则应确保操作不发生冲突。对控件的操作不同,这些事件过程发生的顺序也不同。Button控件的单击事件发生顺序为:
MouseMove→MouseDown→Click→MouseUp→MouseLeave
注意:如果用户试图双击按钮控件,则其中每一次单击都将分别处理;也即按钮控件不支持双击事件。
6.增强按钮的视觉效果
按钮控件象复选框和选项按钮一样,可通过Image属性设置Button控件上的图标以增强视觉效果,然后设置图标(图片)的属性:ImageAlign显示图标(图片)的位置。通过设置ImageIndex(图片在图片框中的索引)以及ImageList(图片框)则可实现如下的效果,比如要向按钮添加图标或位图,或者在单击、禁止控件时显示不同的图象等等。
1.向窗体添加按钮
在应用程序中很可能要使用多个按钮。就象在其他容器控件上绘制按钮那样,从工具箱里把Button控件直接拖到窗体上即可。可用鼠标调整按钮的大小,也可通过设置Location(坐标,用来确定控件相对窗体左上方顶点的位置)和Size(大小,第一个参数代表宽度,第二个参数代表高度)属性进行调整。
2.设置按钮显示文本
可用Text属性改变按钮上显示的文本。设计时,可在控件的“属性窗口”中设置此属性。在设计时设置Text属性后将动态更新按钮文本。Text属性最多包含255个字符。若标题超过了命令按钮的宽度,则会折到下一行。但是,如果控件无法容纳其全部长度,则标题会被剪切。可以通过设置Font属性改变在命令按钮上显示的字体。
3.创建键盘快捷方式
可通过Text属性创建按钮的访问键快捷方式。为此,只需在作为访问键的字母前添加一个连字符(&)。例如,要为标题“Ok”创建访问键,应在字母“O”前添中连字符,于是得到“&Ok”。运行时,字母“O”将带下划线,同时按Alt+O键就可执行单击按钮程序所执行的动作。
注意:如果不创建访问键,而又要使标题中包含连字符,应添加两个连字符(&&)。这样,在标题中就只显示一个连字符。
4.选定按钮
运行时,可用鼠标或键盘通过下述方法选定按钮:
(1)用鼠标单击按钮;
(2)按Tab键,将焦点转移到按钮上,然后按Enter键选定按钮;
(3)按按钮的访问键([Alt+带有下划线的字母])。
5.Click事件
运行时单击按钮,将触发按钮的Click事件并执行写入Click事件过程中的代码,同时,单击按钮的过程也将生成MouseMove、MouseLeave、MouseDown和MouseUp等事件。如果要在这些相关事件中附加事件过程,则应确保操作不发生冲突。对控件的操作不同,这些事件过程发生的顺序也不同。Button控件的单击事件发生顺序为:
MouseMove→MouseDown→Click→MouseUp→MouseLeave
注意:如果用户试图双击按钮控件,则其中每一次单击都将分别处理;也即按钮控件不支持双击事件。
6.增强按钮的视觉效果
按钮控件象复选框和选项按钮一样,可通过Image属性设置Button控件上的图标以增强视觉效果,然后设置图标(图片)的属性:ImageAlign显示图标(图片)的位置。通过设置ImageIndex(图片在图片框中的索引)以及ImageList(图片框)则可实现如下的效果,比如要向按钮添加图标或位图,或者在单击、禁止控件时显示不同的图象等等。
什么是oop--什么是oop
OOP(Object-Oriented-Programming)是相对于结构化程序设计(Structure Programming)而言的,表示采用面向对象的思想进行软件的编制。它是当今最流行的编程模式。“面向对象”技术追求的是软件系统对现实世界的直接模拟,尽量实现将现实世界中的事物直接映射到软件系统的解空间。面向对象编程和以前的编程思想有所不同,因为它把一个新的概念--对象,作为程序代码的整个结构的基础和组成元素。而类就是对象的抽象和概括,类是数据、属性和方法的封装,从某种角度来讲,类就像一个没有界面的控件。
对象的定义:对象是现实世界中的一个实体。它有如下特征:有一个名字以区别于其他的对象;有一个状态用来描述它的默写特征;有一组操作,每一个操作决定于对象的一种功能或行为,对象的操作可分为两类:一类是自身承受的操作,一类是加于其他对象的操作,是其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的独立实体。
例如下面这个例子:
对象的状态: 对象名:张三 性别:女 身高:1.65米 体重:55公斤对象的功能: 回答体重 回答身高 回答性别 教概率课 当家教在计算机世界中可以把对象看成是存储中的一个可标识的区域,它能保存固定或可变数目的数值。对象的划分并没有惟一的标准,它依赖于设置对象的目的和所需要的操作。一个对象的状态并不是完全用来直接为外界服务的,但其本身是能够为外界服务的基础。所以对象的特征表现为:模块的独立性,也就是模块内部状态不因外界的干扰而改变,模块间依赖性小,各模块可独立为系统所组合选用和复用;动态连结性,即通过消息激活机制,把对象之间动态联系在一起,使整个机制运转起来,便称为对象的连结性;易维护性,就是对象的功能被“隐藏”,修改完善功能被局限于该对象的内部,不会波及到外部。
在面向对象系统中,对象之间的联系是通过消息来传递的。消息,是对象之间相互请求或相互协作的途径,是要求某个对象执行某个功能操作的规格的说明。它有如下的性质:
(1)同一个对象可接收不同形式的多个消息,产生不同的响应;
(2)相同形式的消息可以送给不同对象,所做出的响应可以是截然不同的;
(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会,对消息的响应并不是必须的。
消息分为公有消息和私有消息,由外界对象直接向其发送的消息是公有消息;而由自己向本身发送的,不对外开放,外界不必了解的是私有消息。
以上我们主要扼要地讨论了一下对象及它的一些特性,现在我们就可以提出类的概念了。类,是对一组客观对象的抽象,它将该组对象所具有的共同特征(包括结构特征和行为特征)集中起来,以说明该组对象的能力和性质。在计算机世界的系统构成上,类形成了一个具有特定功能的模块和一种代码共享的手段。
面向对象的系统都具有三个特性:封装性、继承性和多态性
封装:将一个数据和与这个数据有关的操作集合放在一起,形成一个能动的实体--对象,用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象即可。目的在于将对象的用户与设计者分开,用户不必知道对象行为的细节,只需用设计者提供的协议命令对象去做就可以。
继承:继承所表达的就是一种对象类之间的相交关系。它使得某类对象可以继承另外一类对象的特征和能力。
若类间具有继承关系,则它们之间应具有下列几个特性:
(1)类间具有共享特征(包括数据和程序代码之间的共享);
(2)类间具有细微的差别或新增部分(包括非共享的程序代码和数据);
(3)类间具有层次结构。
对象的定义:对象是现实世界中的一个实体。它有如下特征:有一个名字以区别于其他的对象;有一个状态用来描述它的默写特征;有一组操作,每一个操作决定于对象的一种功能或行为,对象的操作可分为两类:一类是自身承受的操作,一类是加于其他对象的操作,是其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的独立实体。
例如下面这个例子:
对象的状态: 对象名:张三 性别:女 身高:1.65米 体重:55公斤对象的功能: 回答体重 回答身高 回答性别 教概率课 当家教在计算机世界中可以把对象看成是存储中的一个可标识的区域,它能保存固定或可变数目的数值。对象的划分并没有惟一的标准,它依赖于设置对象的目的和所需要的操作。一个对象的状态并不是完全用来直接为外界服务的,但其本身是能够为外界服务的基础。所以对象的特征表现为:模块的独立性,也就是模块内部状态不因外界的干扰而改变,模块间依赖性小,各模块可独立为系统所组合选用和复用;动态连结性,即通过消息激活机制,把对象之间动态联系在一起,使整个机制运转起来,便称为对象的连结性;易维护性,就是对象的功能被“隐藏”,修改完善功能被局限于该对象的内部,不会波及到外部。
在面向对象系统中,对象之间的联系是通过消息来传递的。消息,是对象之间相互请求或相互协作的途径,是要求某个对象执行某个功能操作的规格的说明。它有如下的性质:
(1)同一个对象可接收不同形式的多个消息,产生不同的响应;
(2)相同形式的消息可以送给不同对象,所做出的响应可以是截然不同的;
(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以对消息不予理会,对消息的响应并不是必须的。
消息分为公有消息和私有消息,由外界对象直接向其发送的消息是公有消息;而由自己向本身发送的,不对外开放,外界不必了解的是私有消息。
以上我们主要扼要地讨论了一下对象及它的一些特性,现在我们就可以提出类的概念了。类,是对一组客观对象的抽象,它将该组对象所具有的共同特征(包括结构特征和行为特征)集中起来,以说明该组对象的能力和性质。在计算机世界的系统构成上,类形成了一个具有特定功能的模块和一种代码共享的手段。
面向对象的系统都具有三个特性:封装性、继承性和多态性
封装:将一个数据和与这个数据有关的操作集合放在一起,形成一个能动的实体--对象,用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象即可。目的在于将对象的用户与设计者分开,用户不必知道对象行为的细节,只需用设计者提供的协议命令对象去做就可以。
继承:继承所表达的就是一种对象类之间的相交关系。它使得某类对象可以继承另外一类对象的特征和能力。
若类间具有继承关系,则它们之间应具有下列几个特性:
(1)类间具有共享特征(包括数据和程序代码之间的共享);
(2)类间具有细微的差别或新增部分(包括非共享的程序代码和数据);
(3)类间具有层次结构。
vb.net的String数据类型
如果一个变量总是存储诸如“我是中国人”之类的字符串而不包含3.1415926这样的数值,则可将其声明为String类型。
在VB.NET中,一个字符串可包含大约2亿(2的31次方)个Unicode字符,字符的机内码从0到65535,前128个字符代表英文字母及标准键盘上的字符,
128到255个字符代表特殊的字符,如拉丁字母、货币符号、分数等。
声明字符串变量的格式:
Dim S As String
然后可将字符串值赋予这个变量,并用字符串函数对其进行操作,如:
S="我是中国人"
默认情况下,String类型变量或其参数是一个可变长度的字符串,随着对字符串赋予新数据,它的长度可增可减。
可以对String类型进行操作的基本函数:
1.Len函数
此函数返回字符串的长度,返回值为长整型(Long),其语法为:
Len(string|varname)
说明:string为任何有效的字符串表达式;varname为任何有效和变量名称。如果varname是Object,Len函数视其为String并且总是返回其包含的字符数,如:
Dim A as String
Dim B as Integer
A="我是中国人" '初始化字符串
B=Len(A) '返回10(一个汉字占2字节)
2.Trim、Ltrim及Rtrim函数
Trim、Ltrim及Rtrim函数完成将字符串中的一部分或全部空格去掉。Trim去掉字符串中的全部空格,Ltrim去掉字符串中起始的空格,而Rtrim将字符串末尾的空格都去掉,例如:
Dim A,B As String
A=" hello " '初始化字符串
B=Trim(A) 'B="hello"
B=Ltrim(B) 'B="hello "
B=Rtrim(B) 'B=" hello"
3.Substring方法:
Substring方法取代以前vb 6.0中的"Right"、"Left"及"Mid"等标准函数,用法是:
StrName.Substring(startChar,Length)
例如:
S.Substring(0,2) '相当于Left(S,2)
S.Substring(S.Length(),-4) '相当于Right(S,4)
vb.net的String数据类型
在VB.NET中,一个字符串可包含大约2亿(2的31次方)个Unicode字符,字符的机内码从0到65535,前128个字符代表英文字母及标准键盘上的字符,
128到255个字符代表特殊的字符,如拉丁字母、货币符号、分数等。
声明字符串变量的格式:
Dim S As String
然后可将字符串值赋予这个变量,并用字符串函数对其进行操作,如:
S="我是中国人"
默认情况下,String类型变量或其参数是一个可变长度的字符串,随着对字符串赋予新数据,它的长度可增可减。
可以对String类型进行操作的基本函数:
1.Len函数
此函数返回字符串的长度,返回值为长整型(Long),其语法为:
Len(string|varname)
说明:string为任何有效的字符串表达式;varname为任何有效和变量名称。如果varname是Object,Len函数视其为String并且总是返回其包含的字符数,如:
Dim A as String
Dim B as Integer
A="我是中国人" '初始化字符串
B=Len(A) '返回10(一个汉字占2字节)
2.Trim、Ltrim及Rtrim函数
Trim、Ltrim及Rtrim函数完成将字符串中的一部分或全部空格去掉。Trim去掉字符串中的全部空格,Ltrim去掉字符串中起始的空格,而Rtrim将字符串末尾的空格都去掉,例如:
Dim A,B As String
A=" hello " '初始化字符串
B=Trim(A) 'B="hello"
B=Ltrim(B) 'B="hello "
B=Rtrim(B) 'B=" hello"
3.Substring方法:
Substring方法取代以前vb 6.0中的"Right"、"Left"及"Mid"等标准函数,用法是:
StrName.Substring(startChar,Length)
例如:
S.Substring(0,2) '相当于Left(S,2)
S.Substring(S.Length(),-4) '相当于Right(S,4)
vb.net的String数据类型
2009年4月8日星期三
vb窗体中控件自动随窗体变化大小
开发中,往往开发人员需要控制控件大小适应窗口的大小,使得软件在不同的分辨率下也显得比例协调.
那么,怎么才能让窗体中控件自动随窗体变化大小呢?
我觉得有一种原始方法很有用,不让窗体可以最大化:比如飞天餐饮软件.......
当然这种方法是绕道而行.开发出来的软件肯定好看不了.
好了,让我们来引出下面这个很有用,比较专业的Model吧.
--------------------------------------------------------------------------------
Option Explicit
Private FormOldWidth As Long
''保存窗体的原始宽度
Private FormOldHeight As Long
''保存窗体的原始高度
''在调用ResizeForm前先调用本函数
Public Sub ResizeInit(FormName As Form)
Dim Obj As Control
FormOldWidth = FormName.ScaleWidth
FormOldHeight = FormName.ScaleHeight
On Error Resume Next
For Each Obj In FormName
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
Next Obj
On Error GoTo 0
End Sub
''按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数
Public Sub ResizeForm(FormName As Form)
Dim Pos(4) As Double
Dim i As Long, TempPos As Long, StartPos As Long
Dim Obj As Control
Dim ScaleX As Double, ScaleY As Double
ScaleX = FormName.ScaleWidth / FormOldWidth
''保存窗体宽度缩放比例
ScaleY = FormName.ScaleHeight / FormOldHeight
''保存窗体高度缩放比例
On Error Resume Next
For Each Obj In FormName
StartPos = 1
For i = 0 To 4
''读取控件的原始位置与大小
TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
If TempPos > 0 Then
Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
StartPos = TempPos + 1
Else
Pos(i) = 0
End If
''根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
Next i
Next Obj
On Error GoTo 0
End Sub
''开发软件时候,把这个modal装入程序中.然后加入如下代码:
Private Sub Form_Load()
Call ResizeInit(Me) ''在程序装入时必须加入
End Sub
Private Sub Form_Resize()
Call ResizeForm(Me) ''确保窗体改变时控件随之改变
End Sub
--------------------------------------------------------------------------------
ok,这样你的软件就可以窗体中控件自动随窗体变化大小!
你的软件至少从外观上从此变得不再那么难看了.而且大分辨率下也显得比例协调了.
那么,怎么才能让窗体中控件自动随窗体变化大小呢?
我觉得有一种原始方法很有用,不让窗体可以最大化:比如飞天餐饮软件.......
当然这种方法是绕道而行.开发出来的软件肯定好看不了.
好了,让我们来引出下面这个很有用,比较专业的Model吧.
--------------------------------------------------------------------------------
Option Explicit
Private FormOldWidth As Long
''保存窗体的原始宽度
Private FormOldHeight As Long
''保存窗体的原始高度
''在调用ResizeForm前先调用本函数
Public Sub ResizeInit(FormName As Form)
Dim Obj As Control
FormOldWidth = FormName.ScaleWidth
FormOldHeight = FormName.ScaleHeight
On Error Resume Next
For Each Obj In FormName
Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "
Next Obj
On Error GoTo 0
End Sub
''按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数
Public Sub ResizeForm(FormName As Form)
Dim Pos(4) As Double
Dim i As Long, TempPos As Long, StartPos As Long
Dim Obj As Control
Dim ScaleX As Double, ScaleY As Double
ScaleX = FormName.ScaleWidth / FormOldWidth
''保存窗体宽度缩放比例
ScaleY = FormName.ScaleHeight / FormOldHeight
''保存窗体高度缩放比例
On Error Resume Next
For Each Obj In FormName
StartPos = 1
For i = 0 To 4
''读取控件的原始位置与大小
TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare)
If TempPos > 0 Then
Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos)
StartPos = TempPos + 1
Else
Pos(i) = 0
End If
''根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小
Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY
Next i
Next Obj
On Error GoTo 0
End Sub
''开发软件时候,把这个modal装入程序中.然后加入如下代码:
Private Sub Form_Load()
Call ResizeInit(Me) ''在程序装入时必须加入
End Sub
Private Sub Form_Resize()
Call ResizeForm(Me) ''确保窗体改变时控件随之改变
End Sub
--------------------------------------------------------------------------------
ok,这样你的软件就可以窗体中控件自动随窗体变化大小!
你的软件至少从外观上从此变得不再那么难看了.而且大分辨率下也显得比例协调了.
浅析VB.NET文件操作类System.IO
文件操作是软件开发中必不可少的任务。记得笔者在学习Visual Basic6.0文件操作的编程时颇费了一番周折。不过现在有了.Net大大简化了开发难度,简化了学习难度,使初学者可以在很短的时间就可以掌握与文件相关的编程技巧。
认识System.IO
在.Net中与文件有关的类都集中在System.IO这个大类中,在此大类中我们可以看见很多以“File”开头的类名。下面我们就介绍几个常用的类,它们分别是:
Directory :用于创建、移动和枚举目录和子目录的静态方法。
File:用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
FileInfo:提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream对象。
FileStream:与 Stream对象配合,完成更多的文件操作。我们将在后一节对它进行介绍。
Path:指定文件的目录路径信息。
第一个任务
在下面的程序片段中我们将使用上面提到的几个类和大家最常用的“文件打开”对话窗来完成一个基于文件的编程。
程序功能:将文件移动到回收站文件夹中,并且从回收站中运行这些程序。
可能很多读者会问,为什么以这段代码为例呢?原因有三个:1.这段代码符合本节的内容。2.在Windows发布之初很多病毒程序就是被放在回收站中的,而这些技术必定会提高读者学习本文的兴趣。3.此程序还有一定的实用性。如果有比较重要的文件你可以将它Copy到回收站中。谁会想到在回收站中保存文件呢?而且对于一般用户来说,他们不会知道回收站可以保存并运行文件,因为双击回收站中的文件不会运行,只会显示它的文件属性。就算打开回收站也只能看见要被删除的文件,而看不见我们专门保存到回收站的文件。
添加控件并设置相关属性:三个Button、一个LISTBOX、一个OPENFILEDIALOG控件。
代码如下
代码是VB.NET编写的。
双击Button1加入如下代码,在代码中有详细的注释:
Private Sub Button1_ClickByVal sender As System.Object ByVal e As System.EventArgs Handles Button1.Click
OpenFileDialog1.ShowDialog‘显示文件打开对话框
Dim fname As New FileInfoOpenFil
eDialog1.FileName
''初始化FILEINFO类,此类可以获得文件的各种信息,在本代码中用来获得文件名
Dim copyf As System.IO.File
''初始化FILE类,此类用来对文件进行具体的操作,本代码中用来实现文件的转移
sname = fname.Name''使用fileinfo类的name属性来获得文件名,但不包含路径
copyf.MoveOpenFileDialog1.FileName ″c\recycled\″ & sname
''移动到回收站文件夹,RECYCLED是回收站文件夹
End Sub
双击Button2加入如下代码,在代码中有详细的注释:
Private Sub Button2_ClickByVal sender As Object ByVal e As System.EventArgs Handles Button2.Click
Dim zh
Dim pj As String
''在listbox控件中选定要运行的文件
zh = ListBox1.SelectedIndex‘用zh记录选中的序列号
pj = ListBox1.Items.Itemzh
''用pj记录序列号所对应的文字,本代码中对应的文字表示文件名
Me.Text = ″正在运行程序″ + pj
''在窗口标题栏处表示运行的程序,这些程序都是在listbox中列出的,即在回收站中的文件
Dim spros As New System.Diagnostics.Process
''Process是进程类,在Visual Basic .Net中与Visual Basic6.0中的shell函数类似,
''在后面的文章中我们将对它进行专门的探讨。
spros.Startpj '' 利用Process类中的start属性运行选定的文件
End Sub
双击在Button3加入如下代码,在代码中有详细的注释:
Private Sub Button3_ClickByVal sender As Object ByVal e As System.EventArgs Handles Button3.Click
Dim dir As System.IO.Directory
''由于目录对象可以直接实现目录的操作所以这里使用它获得回收文件的个数
Dim i As Integer
Dim filename fileno
ListBox1.Items.Clear‘清空listbox,为下次显示做准备
filename = dir.GetFiles″c\recycled″ ″″
''利用Directory类的Getfile属性获得文件数组
fileno = dir.GetFiles″c\recycled″ ″″.Length
''利用Length获得数组的大小即回收站中到底有多少文件
For i = 0 To fileno - 1
ListBox1.Items.Addfilenamei
''将每个文件添加到listbox中,显示回收站中的具体文件
Next
End Sub
程序说明:如果你要运行文件,请先选中一个文件,再点击“从回收站启动文件”按钮。在显示回收站文件中各位会看见一些奇怪的文件名,这些文件是你删除的文件,但是微软将这些文件的原文件名给改变了。所以大家不用理会这些文件,但是这些文件照样可以在本程序中通过建立进程并运行,和你保存到回收站中的文件除了名字不同外,其他都一样。注意当你在“我的电脑”和“资源管理器”中打开回收站并选择“清空回收站”,那回收站中所有文件都会被删除。
此外本程序将移动的文件保存在C盘中的回收站,你如果想保存到其他盘中的回收站,请将盘符改为相应的盘名。如:D:\F\等等。
认识System.IO
在.Net中与文件有关的类都集中在System.IO这个大类中,在此大类中我们可以看见很多以“File”开头的类名。下面我们就介绍几个常用的类,它们分别是:
Directory :用于创建、移动和枚举目录和子目录的静态方法。
File:用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
FileInfo:提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream对象。
FileStream:与 Stream对象配合,完成更多的文件操作。我们将在后一节对它进行介绍。
Path:指定文件的目录路径信息。
第一个任务
在下面的程序片段中我们将使用上面提到的几个类和大家最常用的“文件打开”对话窗来完成一个基于文件的编程。
程序功能:将文件移动到回收站文件夹中,并且从回收站中运行这些程序。
可能很多读者会问,为什么以这段代码为例呢?原因有三个:1.这段代码符合本节的内容。2.在Windows发布之初很多病毒程序就是被放在回收站中的,而这些技术必定会提高读者学习本文的兴趣。3.此程序还有一定的实用性。如果有比较重要的文件你可以将它Copy到回收站中。谁会想到在回收站中保存文件呢?而且对于一般用户来说,他们不会知道回收站可以保存并运行文件,因为双击回收站中的文件不会运行,只会显示它的文件属性。就算打开回收站也只能看见要被删除的文件,而看不见我们专门保存到回收站的文件。
添加控件并设置相关属性:三个Button、一个LISTBOX、一个OPENFILEDIALOG控件。
代码如下
代码是VB.NET编写的。
双击Button1加入如下代码,在代码中有详细的注释:
Private Sub Button1_ClickByVal sender As System.Object ByVal e As System.EventArgs Handles Button1.Click
OpenFileDialog1.ShowDialog‘显示文件打开对话框
Dim fname As New FileInfoOpenFil
eDialog1.FileName
''初始化FILEINFO类,此类可以获得文件的各种信息,在本代码中用来获得文件名
Dim copyf As System.IO.File
''初始化FILE类,此类用来对文件进行具体的操作,本代码中用来实现文件的转移
sname = fname.Name''使用fileinfo类的name属性来获得文件名,但不包含路径
copyf.MoveOpenFileDialog1.FileName ″c\recycled\″ & sname
''移动到回收站文件夹,RECYCLED是回收站文件夹
End Sub
双击Button2加入如下代码,在代码中有详细的注释:
Private Sub Button2_ClickByVal sender As Object ByVal e As System.EventArgs Handles Button2.Click
Dim zh
Dim pj As String
''在listbox控件中选定要运行的文件
zh = ListBox1.SelectedIndex‘用zh记录选中的序列号
pj = ListBox1.Items.Itemzh
''用pj记录序列号所对应的文字,本代码中对应的文字表示文件名
Me.Text = ″正在运行程序″ + pj
''在窗口标题栏处表示运行的程序,这些程序都是在listbox中列出的,即在回收站中的文件
Dim spros As New System.Diagnostics.Process
''Process是进程类,在Visual Basic .Net中与Visual Basic6.0中的shell函数类似,
''在后面的文章中我们将对它进行专门的探讨。
spros.Startpj '' 利用Process类中的start属性运行选定的文件
End Sub
双击在Button3加入如下代码,在代码中有详细的注释:
Private Sub Button3_ClickByVal sender As Object ByVal e As System.EventArgs Handles Button3.Click
Dim dir As System.IO.Directory
''由于目录对象可以直接实现目录的操作所以这里使用它获得回收文件的个数
Dim i As Integer
Dim filename fileno
ListBox1.Items.Clear‘清空listbox,为下次显示做准备
filename = dir.GetFiles″c\recycled″ ″″
''利用Directory类的Getfile属性获得文件数组
fileno = dir.GetFiles″c\recycled″ ″″.Length
''利用Length获得数组的大小即回收站中到底有多少文件
For i = 0 To fileno - 1
ListBox1.Items.Addfilenamei
''将每个文件添加到listbox中,显示回收站中的具体文件
Next
End Sub
程序说明:如果你要运行文件,请先选中一个文件,再点击“从回收站启动文件”按钮。在显示回收站文件中各位会看见一些奇怪的文件名,这些文件是你删除的文件,但是微软将这些文件的原文件名给改变了。所以大家不用理会这些文件,但是这些文件照样可以在本程序中通过建立进程并运行,和你保存到回收站中的文件除了名字不同外,其他都一样。注意当你在“我的电脑”和“资源管理器”中打开回收站并选择“清空回收站”,那回收站中所有文件都会被删除。
此外本程序将移动的文件保存在C盘中的回收站,你如果想保存到其他盘中的回收站,请将盘符改为相应的盘名。如:D:\F\等等。
VB.NET中利用Split和Replace函数计算
对于Visual Basic开发者来说,处理字符串和执行各种各样的字符串操作是十分重要的。当你需要确定一个长字符串中的字数时,你可以使用VB.NET中的一个简单函数来获得所需要的结果。
Split函数使你能够将长字符串分离为单独的字;但是如果在字与字之间不止一个空格,Split就会返回一个错误的结果。为了防止这种情况发生,你可以在使用Split之前用Replace函数来替换多个空格的出现。列表A给出了一个例子。
列表A
Private Sub CountWords()
Dim strText As String = "It''s a wonderful world"
Dim iCount As Integer
Do While (strText.IndexOf(Space(2)) >= 0)
strText = strText.Replace(Space(2), Space(1))
Loop
iCount = Split(strText, Space(1)).Length
MsgBox(iCount.ToString())
End Sub
在这个例子中,我创建了字符串strText,再将它设置成有多个字符的长字符串。然后,我利用Replace函数来把出现的多个空格替换成一个空格。这样做是为了把字符串strText准备就绪,让你能够使用Split函数并提供正确的结果。接着,我将strText输入Split函数,并且得到了包括在字符串strText中的字数。
Split函数使你能够将长字符串分离为单独的字;但是如果在字与字之间不止一个空格,Split就会返回一个错误的结果。为了防止这种情况发生,你可以在使用Split之前用Replace函数来替换多个空格的出现。列表A给出了一个例子。
列表A
Private Sub CountWords()
Dim strText As String = "It''s a wonderful world"
Dim iCount As Integer
Do While (strText.IndexOf(Space(2)) >= 0)
strText = strText.Replace(Space(2), Space(1))
Loop
iCount = Split(strText, Space(1)).Length
MsgBox(iCount.ToString())
End Sub
在这个例子中,我创建了字符串strText,再将它设置成有多个字符的长字符串。然后,我利用Replace函数来把出现的多个空格替换成一个空格。这样做是为了把字符串strText准备就绪,让你能够使用Split函数并提供正确的结果。接着,我将strText输入Split函数,并且得到了包括在字符串strText中的字数。
ASP.NET 2.0中直接将Access数据库导入到Excel文件中
在实际的开发应用中,数据库导入导出是经常遇到的问题,尤其是数据库与Excel文件之间的导入导出,还存在数据类型不一致的问题。例如:数据库的数字超长时会在Excel里格式化成科学计数法的格式,或者记录内容是数字和字符的混合内容会丢失内容等等。将Access数据库的内容直接导入到Excel则可以避免这些问题。
下面例子就是实现这个功能,例子中的数据库使用《ASP.NET 2.0应用开发技术》一书中自带的数据库为例子。 ASP.NET 2.0中直接将Access数据库导入到Excel文件中
另外,需要注意:Excel文件有诸多限制,在如果数据库记录内容很多,还要计算每次导出的数量和Sheet数目,另外,对Sheet名字相同的监测也省略了,需要的读者请根据情况自行添加上去。结合存储过程的分页功能实现起来比较好。
C#:
<%@ Page Language="C#" %>
直接将Access数据库导入到Excel文件
VB.NET
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim sql As String
Dim connstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ASPNET20Book.mdb;Persist Security Info=True"
Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(connstr)
Dim cmd As System.Data.OleDb.OleDbCommand
cn.Open
sql = "select Count(*) From Paging"
cmd = New System.Data.OleDb.OleDbCommand(sql, cn)
Dim RecordCount As Integer = CType(cmd.ExecuteScalar, Integer)
sql = "select top 65535 * into [Excel 8.0;database=" + Server.MapPath(".") + "\ASPNET20Book.xls].[Sheet1] from Paging"
cmd = New System.Data.OleDb.OleDbCommand(sql, cn)
cmd.ExecuteNonQuery
cn.Close
cn.Dispose
cn = Nothing
End Sub
ASP.NET 2.0中直接将Access数据库导入到Excel文件中
下面例子就是实现这个功能,例子中的数据库使用《ASP.NET 2.0应用开发技术》一书中自带的数据库为例子。 ASP.NET 2.0中直接将Access数据库导入到Excel文件中
另外,需要注意:Excel文件有诸多限制,在如果数据库记录内容很多,还要计算每次导出的数量和Sheet数目,另外,对Sheet名字相同的监测也省略了,需要的读者请根据情况自行添加上去。结合存储过程的分页功能实现起来比较好。
C#:
<%@ Page Language="C#" %>
VB.NET
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim sql As String
Dim connstr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ASPNET20Book.mdb;Persist Security Info=True"
Dim cn As System.Data.OleDb.OleDbConnection = New System.Data.OleDb.OleDbConnection(connstr)
Dim cmd As System.Data.OleDb.OleDbCommand
cn.Open
sql = "select Count(*) From Paging"
cmd = New System.Data.OleDb.OleDbCommand(sql, cn)
Dim RecordCount As Integer = CType(cmd.ExecuteScalar, Integer)
sql = "select top 65535 * into [Excel 8.0;database=" + Server.MapPath(".") + "\ASPNET20Book.xls].[Sheet1] from Paging"
cmd = New System.Data.OleDb.OleDbCommand(sql, cn)
cmd.ExecuteNonQuery
cn.Close
cn.Dispose
cn = Nothing
End Sub
ASP.NET 2.0中直接将Access数据库导入到Excel文件中
VB.NET为智能设备编写半自动初始化类
四、程序实现核心代码注释
1、我将这个半自动初始化文件类命名为clSAPPOption,类内结构及包含过程的功能说明如下:
两个区域#Region "应用程序使用的选项结构定义"、#Region "应用程序选项的变量声明"中的内容是按初始化选项级组织的类及类的实例,每一个类表示程序选项的一个初始化节,必须由最终使用者根据实际选项需要自行手工补充。
fnGetAppDirectory:取得应用程序的运行目录
sbInitialDefaultAPPOption:设置程序选项的默认初始值(这个过程中的代码需根据实际需要手工修改)。
fnSaveAppOption:将类内的程序选项保存到一个指定的文件中. (这个过程中的部分代码需根据实际需要手工修改)
fnLoadAppOption:在指定的文件中读取应用程序的选项信息并保存到当前类中(这个过程中的部分代码需根据实际需要手工修改)。
fnXMLElementToSimpleObject:将一个XMLElement转为它代表的简单对象,所谓简单对象就是诸如int32\int16之类的基本net对象。
fnXMLElementToClassObject:将一个XMLElement转换为它代表的类对象。
fnXMLElementToArray:将一个XMLElement转为它代表的数组。
fnArrayToXML:将一个数组放入XML文件中,目前只支持一维数组:例如dim aString(10) as string
fnClassObjectToXML:将一个类对象转换为xml元素的表示形式。
fnSimpleObjectToXML:将一个简单对象改为XML元素表示
注:其中fnXMLElementToXXXX和fnXXXXToXML功能相对应,互为反函数。
2、程序的实现是非常简单的,fnClassObjectToXML对指定的类进行反射操作,使用类的类型的GetFields方法枚举类内的成员变量信息,然后根据成员变量的类型调用fnSimpleObjectToXML或fnArrayToXML,在函数结束的时候,将要转换的类以一个XMLElement对象的形式返回。
tobjClassObjectType = ni_objClassObject.GetType '取得类的类型,以利于反射调用
….其它代码
REM 以结构内的所有值进行反射取值, 并存入xml对象中
For Each tobjFieldInfo In tobjClassObjectType.GetFields
If tobjFieldInfo.FieldType.IsArray = False Then '只是一个简单类型,直接取得值
tobjXMLElement = fnSimpleObjectToXML(tobjFieldInfo.GetValue(ni_objClassObject), _
ni_objXMLDocument, _
tobjFieldInfo.Name)
tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
Else
REM 如果是一个数组类型,则进行数组方法的调用以取得值,
'目前只支持一维数组元素
tobjXMLElement = fnArrayToXML(tobjFieldInfo.GetValue(ni_objClassObject), ni_objXMLDocument, tobjFieldInfo.Name, tobjFieldInfo.FieldType.FullName)
'将数组对象放入结构的xml对象中
tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
End If
fnSimpleObjectToXML的实现也很简单,根据前文确立的简单对象的定义,fnSimpleObjectToXML过程所要生成的xml对象的几个要素可以这样获取:ObjectName在f nClassObjectToXML作反射后已经获取,并以参数传递的方式在调用fnSimpleObjectToXML时提供了。 ObjectType数据类型则可以利用ni_objSimpleObject.GetType.FullName方法取得, ni_objSimpleObject就是在函数调用时传入的简单对象的值。
在编写fnArrayToXML过程时出现了一点小问题,由于调用方不可能要求数组的元素逐个传入,所以对数组的元素个数以及元素的值无法在函数中以对象反射的方式直接获取。幸运的是,在Net反射操作中,可以利用Invoke方法来调用原始对象内的函数或属性过程,而数组的共享方法GetLength、GetValue功能适好是取数组元素个数及指定下标的元素值,所以问题立刻迎刃而解。
'利用反射调用数组的getLenght方法取得数组的大小,这里仅支持一维数组,但对于初始化文件已足够用了
tobjXMLAttribute = ni_objXMLDocument.CreateAttribute("ArrayLength")
tobjMethodInfo = tobjArrayType.GetMethod("GetLength")
ReDim taobjParameter(0)
taobjParameter(0) = 0
ti32Tempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
tobjXMLAttribute.Value = ti32Tempa
tobjXMLElement.SetAttributeNode(tobjXMLAttribute)
tobjXMLAttribute = Nothing
'加入数组的内的元素
For ti32LoopA = 0 To ti32Tempa - 1
'利用反射取得数组的GetValue方法取得实际元素的值
ReDim taobjParameterType(0)
taobjParameterType(0) = GetType(Integer)
tobjMethodInfo = tobjArrayType.GetMethod("GetValue", taobjParameterType)
ReDim taobjParameter(0)
taobjParameter(0) = ti32LoopA
tobjTempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
' 将数组元素放入对xml对象中
tobjXMLElementA = fnSimpleObjectToXML(tobjTempa, ni_objXMLDocument, ti32LoopA)
tobjXMLElement.AppendChild(tobjXMLElementA)
Next ti32LoopA
从XML转为net对象的过程基本都没有什么技术难度。我只是根据xml中包含的ObjectType信息简单获得简单对象的类型,然后直接调用net强制转换类的功能将XML文件中指定的对象储存的数值重新恢复为原来的net对象。代码如下:
'根据XMLelement结构元素中指定的对象类型,建立对象
tobjType = Type.GetType(tobjXmlSimpleObjectElement.GetAttribute("ObjectType"))
tobjReturnSimpleObject = Convert.ChangeType(tobjXmlSimpleObjectElement.InnerText, tobjType, Nothing)
对于Xml转为数组用数组、转为类对象的方法可以参阅本文所附源代码。
3、初始化文件类实例的调用:
类定义完成以后,可以在程序的全局范围定义初始化类的实例。在模块内定义就可以了:
Public gobjAppOption As New clsAPPOption
可以在程序启动的时候读初始化文件信息到类中,我是放在主窗体的load事件中的。
'读取程序的选项
gobjAppOption.fnLoadAppOption()
可以在程序的任意地方保存当前半自动初始化类的值到xml文件中,我在主窗体的closed事件中加入保存代码:
gobjAppOption.fnSaveAppOption() '保存应用程序的选项
程序的任意地方你都可以调用半自动初始化文件类的实例来读取/保存程序选项的当前值:
'可以很好地利用VS提供的自动列出成员的功能列出程序选项
'读取选项的示例代码
MessageBox.Show(gobjAppOption.mobjAPPGeneralOption.astrShowFileFilter(0))
'保存选项的示例代码
'gobjAppOption.mobjAPPGeneralOption.astrHideFileFilter(0) = "*.zip"
虽然这个半自动化初始化文件类还是需要手工添加少量代码(在源代码明确注释要手工添加的部分),但还是那句老话,如果一切事情电脑都会做的时候,离程序员下岗的日子就不远了。
1、我将这个半自动初始化文件类命名为clSAPPOption,类内结构及包含过程的功能说明如下:
两个区域#Region "应用程序使用的选项结构定义"、#Region "应用程序选项的变量声明"中的内容是按初始化选项级组织的类及类的实例,每一个类表示程序选项的一个初始化节,必须由最终使用者根据实际选项需要自行手工补充。
fnGetAppDirectory:取得应用程序的运行目录
sbInitialDefaultAPPOption:设置程序选项的默认初始值(这个过程中的代码需根据实际需要手工修改)。
fnSaveAppOption:将类内的程序选项保存到一个指定的文件中. (这个过程中的部分代码需根据实际需要手工修改)
fnLoadAppOption:在指定的文件中读取应用程序的选项信息并保存到当前类中(这个过程中的部分代码需根据实际需要手工修改)。
fnXMLElementToSimpleObject:将一个XMLElement转为它代表的简单对象,所谓简单对象就是诸如int32\int16之类的基本net对象。
fnXMLElementToClassObject:将一个XMLElement转换为它代表的类对象。
fnXMLElementToArray:将一个XMLElement转为它代表的数组。
fnArrayToXML:将一个数组放入XML文件中,目前只支持一维数组:例如dim aString(10) as string
fnClassObjectToXML:将一个类对象转换为xml元素的表示形式。
fnSimpleObjectToXML:将一个简单对象改为XML元素表示
注:其中fnXMLElementToXXXX和fnXXXXToXML功能相对应,互为反函数。
2、程序的实现是非常简单的,fnClassObjectToXML对指定的类进行反射操作,使用类的类型的GetFields方法枚举类内的成员变量信息,然后根据成员变量的类型调用fnSimpleObjectToXML或fnArrayToXML,在函数结束的时候,将要转换的类以一个XMLElement对象的形式返回。
tobjClassObjectType = ni_objClassObject.GetType '取得类的类型,以利于反射调用
….其它代码
REM 以结构内的所有值进行反射取值, 并存入xml对象中
For Each tobjFieldInfo In tobjClassObjectType.GetFields
If tobjFieldInfo.FieldType.IsArray = False Then '只是一个简单类型,直接取得值
tobjXMLElement = fnSimpleObjectToXML(tobjFieldInfo.GetValue(ni_objClassObject), _
ni_objXMLDocument, _
tobjFieldInfo.Name)
tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
Else
REM 如果是一个数组类型,则进行数组方法的调用以取得值,
'目前只支持一维数组元素
tobjXMLElement = fnArrayToXML(tobjFieldInfo.GetValue(ni_objClassObject), ni_objXMLDocument, tobjFieldInfo.Name, tobjFieldInfo.FieldType.FullName)
'将数组对象放入结构的xml对象中
tobjXMLClassObjectElement.AppendChild(tobjXMLElement)
End If
fnSimpleObjectToXML的实现也很简单,根据前文确立的简单对象的定义,fnSimpleObjectToXML过程所要生成的xml对象的几个要素可以这样获取:ObjectName在f nClassObjectToXML作反射后已经获取,并以参数传递的方式在调用fnSimpleObjectToXML时提供了。 ObjectType数据类型则可以利用ni_objSimpleObject.GetType.FullName方法取得, ni_objSimpleObject就是在函数调用时传入的简单对象的值。
在编写fnArrayToXML过程时出现了一点小问题,由于调用方不可能要求数组的元素逐个传入,所以对数组的元素个数以及元素的值无法在函数中以对象反射的方式直接获取。幸运的是,在Net反射操作中,可以利用Invoke方法来调用原始对象内的函数或属性过程,而数组的共享方法GetLength、GetValue功能适好是取数组元素个数及指定下标的元素值,所以问题立刻迎刃而解。
'利用反射调用数组的getLenght方法取得数组的大小,这里仅支持一维数组,但对于初始化文件已足够用了
tobjXMLAttribute = ni_objXMLDocument.CreateAttribute("ArrayLength")
tobjMethodInfo = tobjArrayType.GetMethod("GetLength")
ReDim taobjParameter(0)
taobjParameter(0) = 0
ti32Tempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
tobjXMLAttribute.Value = ti32Tempa
tobjXMLElement.SetAttributeNode(tobjXMLAttribute)
tobjXMLAttribute = Nothing
'加入数组的内的元素
For ti32LoopA = 0 To ti32Tempa - 1
'利用反射取得数组的GetValue方法取得实际元素的值
ReDim taobjParameterType(0)
taobjParameterType(0) = GetType(Integer)
tobjMethodInfo = tobjArrayType.GetMethod("GetValue", taobjParameterType)
ReDim taobjParameter(0)
taobjParameter(0) = ti32LoopA
tobjTempa = tobjMethodInfo.Invoke(ni_objArray, taobjParameter)
' 将数组元素放入对xml对象中
tobjXMLElementA = fnSimpleObjectToXML(tobjTempa, ni_objXMLDocument, ti32LoopA)
tobjXMLElement.AppendChild(tobjXMLElementA)
Next ti32LoopA
从XML转为net对象的过程基本都没有什么技术难度。我只是根据xml中包含的ObjectType信息简单获得简单对象的类型,然后直接调用net强制转换类的功能将XML文件中指定的对象储存的数值重新恢复为原来的net对象。代码如下:
'根据XMLelement结构元素中指定的对象类型,建立对象
tobjType = Type.GetType(tobjXmlSimpleObjectElement.GetAttribute("ObjectType"))
tobjReturnSimpleObject = Convert.ChangeType(tobjXmlSimpleObjectElement.InnerText, tobjType, Nothing)
对于Xml转为数组用数组、转为类对象的方法可以参阅本文所附源代码。
3、初始化文件类实例的调用:
类定义完成以后,可以在程序的全局范围定义初始化类的实例。在模块内定义就可以了:
Public gobjAppOption As New clsAPPOption
可以在程序启动的时候读初始化文件信息到类中,我是放在主窗体的load事件中的。
'读取程序的选项
gobjAppOption.fnLoadAppOption()
可以在程序的任意地方保存当前半自动初始化类的值到xml文件中,我在主窗体的closed事件中加入保存代码:
gobjAppOption.fnSaveAppOption() '保存应用程序的选项
程序的任意地方你都可以调用半自动初始化文件类的实例来读取/保存程序选项的当前值:
'可以很好地利用VS提供的自动列出成员的功能列出程序选项
'读取选项的示例代码
MessageBox.Show(gobjAppOption.mobjAPPGeneralOption.astrShowFileFilter(0))
'保存选项的示例代码
'gobjAppOption.mobjAPPGeneralOption.astrHideFileFilter(0) = "*.zip"
虽然这个半自动化初始化文件类还是需要手工添加少量代码(在源代码明确注释要手工添加的部分),但还是那句老话,如果一切事情电脑都会做的时候,离程序员下岗的日子就不远了。
2009年4月5日星期日
Visual Basic 2005 简介
新闻简介:开发人员的工作效率是这一版 Microsoft Visual Studio 发布的目标。不管您使用何种应用程序类型或者选择何种语言,Microsoft 一直致力于构建集成开发环境 (IDE)、类库和语言套件,以使构建和部署应用程序尽可能地简单。
我们(本书的作者)很明显地看到,Microsoft 已经考察了编码的各个方面(包括代码编写本身、调试和部署),而且实际分析了如何才能使这些工作更有效率。这些增强功能影响深远,其中包括 Microsoft Visual Basic .NET 语言本身的改变、IDE 的改进、数据访问和显示的简化,还有一些改变提高了开发人员构造专业用户界面的工作效率,向框架中添加的众许多新类也减少了您编写的代码的数量,同时提高了部署的功能并扩大了部署
关 键 词: Visual Basic 2005 Visual Basic
开发人员的工作效率是这一版 Microsoft Visual Studio 发布的目标。不管您使用何种应用程序类型或者选择何种语言,Microsoft 一直致力于构建集成开发环境 (IDE)、类库和语言套件,以使构建和部署应用程序尽可能地简单。
我们(本书的作者)很明显地看到,Microsoft 已经考察了编码的各个方面(包括代码编写本身、调试和部署),而且实际分析了如何才能使这些工作更有效率。这些增强功能影响深远,其中包括 Microsoft Visual Basic .NET 语言本身的改变、IDE 的改进、数据访问和显示的简化,还有一些改变提高了开发人员构造专业用户界面的工作效率,向框架中添加的众许多新类也减少了您编写的代码的数量,同时提高了部署的功能并扩大了部署的简单性。
本书将深入分析这每一个方面。另外,虽然本书以构建桌面应用程序为重点,但大多数开发人员至少会进行一些 Web 开发。因此,第 6 章“构建 Web 应用程序”介绍 ASP.NET 中的一些最重要的改变。
本简介对这些主题进行概要介绍,并指出您可以从中获得更深层信息的特定章节。您可以通读本书,也可以直接跳到最感兴趣的章节。
本书的读者
本书为 Visual Basic 开发人员撰写。如果您是一名 Visual Basic 6 开发人员,您应该从第 1 章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”开始阅读,该章将带您快速进行 .NET Framework 开发。本书其余部分介绍 Visual Basic 的重要增强功能,这些增强功能可以提高开发应用程序的效率。
如果您已经是一名 .NET 开发人员,则可跳过第 1 章直接进入第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
本书的内容
本书包含八章。第一章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”对目前使用 Visual Basic 6 的开发人员最为有用。它介绍 .NET Framework 的开发。
本节对各章进行说明,并提供关于每个主题的介绍性信息。
重要事项要运行本书中的示例,需要安装两个软件:Visual Studio 2005 和 SQL Server 桌面、开发人员版、企业版或桌面引擎版。SQL Server 2000 的安装应该带有 Northwind 示例数据库。代码示例位于 MSDN 上的 http://msdn.microsoft.com/vbasic/VB6Migration。
返回页首
第 2 章,“Visual Basic 2005 的语言增强功能”
本章介绍泛型、My 对象和新的运算符。
泛型.NET Framework 最重要的增强功能可能就是引入了泛型。使用泛型可很轻松地创建特定于所存储的对象类型的集合。
Dim customerDictionaryAs New Dictionary(Of String, Customer)
customerDictionary.Add(currentCust.FullName, currentCust)
本例中,customerDictionary只能存储 Customer 类型的项。而且,查找结果明确是一个 String 值。因为该集合知道它所存储的对象类型(是 Customers 而不仅仅是“对象”),所以它可以提供完整的 Microsoft 智能感知,如下图所示。
图 I-1 泛型集合中的智能感知。
My Object Visual Basic .NET 的另一个重要增强功能就是简称为“My 对象”的功能。该功能提供对强大功能相当快速而简单的访问。例如,My.Application.Log.WriteEntry 可让您将信息写入一个文本文件、事件日志或者其他目标。My.Computer.Audio.PlaySystemSound 可以让您播放预定义的操作系统声音,而 My.Computer.Audio.Play 可以让您播放任何 .wav 文件。My 对象还为项目中的项提供默认实例。例如,您可以使用 My.Forms.MainForm.Show 来显示一个窗体而无需先创建其实例。
新运算符Visual Basic .NET 还包括很多新的关键字。IsNot 和 Nothing 一起使用可以使比较变得更加容易。过去,您通常必须编写 If Not X Is Nothing Then。现在,则这可以写成 If X IsNotNothing Then。Visual Basic .NET 还支持运算符重载、泛型,以及很多其他的高级编程功能。
有关这些增强功能的详细信息,请参阅第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
第 3 章,“Visual Studio 2005 集成开发环境”
Visual Basic 开发一直以来都与工作效率相关,而提供这种工作效率的关键工具就是 Visual Studio。使用 Visual Studio 2005,可以全面提升工作效率,可以更好、更容易地导航帮助内容,实现更简单的开发环境自定义以及更高效的编码和调试体验,其中包括“编辑并继续 (Edit-And-Continue)”的重新引入。
编码和调试增强功能当使用新的集成开发环境 (IDE) 时,您将看到为了在编码中加入“上下文”而做出的极大努力。即,在很多情况下,您不必导航到 IDE 中的其他窗口来获得需要的信息。在其他情况下,IDE 提供智能信息筛选功能,以便将最有可能的选择置于最突出的位置,并防止极少使用的选项干扰视图。在您第一次访问对象属性时可以看到该功能,如下图所示。
图 I-2 对象成员的渐进式显示。
您会发现,Visual Studio 2005 可以显示对象的所有成员,也可以通过筛选列表只显示最常用的成员,从而使您轻松找到所需的成员(例如,Connection 的 String 属性)。
Visual Studio 2005 还进一步扩展了常见的 Visual Basic 代码展开功能。您已经习惯了在起始处键入 Function 声明,然后让 IDE 自动插入 End Function。现在,这已经扩展到诸如属性声明这样的内容。键入 public property UserName as String并按 Enter 键可以自动插入下列代码:
Public Property UserName() As String
Get
End Get
Set(ByVal value As String)
End Set
End Property
Visual Studio 2005 还在调试时将各种信息置于您容易获得的位置,使您可以方便操作各种简单和复杂类型,而无需打开并浏览“Watch”窗口。下图显示如何直接在代码编辑器中显示一个复杂类型。
图 I-3 就地显示复杂类型的属性。
Visual Basic 6 提供的最大的工作效率增强功能之一就是“编辑并继续”。该功能曾经是调试过程中的主要手段,遗憾的是,以前 Visual Studio .NET 2002 或 2003 中没有包括该功能。现在“编辑并继续”又可以使用了,使您可以修复错误然后继续执行,而不用停止和重新启动。
IDE自定义和帮助系统增强功能Visual Basic 开发人员高度评价了自定义其开发环境,以及将窗口置于对他们最有利位置的功能。Visual Studio 一直都提供这种功能,但是在 Visual Studio 2005 中,该功能在几个关键部分进行了重大增强。首先,Visual Studio 2005 解决了“我不知道该窗口将停靠在何处”这一问题 — 当发生该问题时,虽然您认为已经将窗口进行了正确定位,但是当您放开它时,窗口或者没有停靠,或者没有按照您预期的方式停靠。在 Visual Studio 2005 中,停靠具有“停靠指导”,如下图所示。
图 I-4 使用停靠指导。
您只需将窗口放置到合适的箭头上就可以实现将其停靠在另一个窗口正上方、上方、右方、下方或者左方的功能。不用再猜测!还有,您的所有 IDE 自定义结果都可以导出和导入。
另外,帮助系统有了很大的改进,为您提供了更好的“F1”体验,而且可以让您访问最新的联机帮助。帮助系统甚至挂接到 Web 站点的“Code Wise”社区,它提供直接在 IDE 中访问 CodeGuru、Net247 和 ASP.NET 等站点的功能。
有关 Visual Studio 2005 提供的重要工作效率增强功能的详细信息,您可以直接参阅第 3 章“Visual Studio 2005 集成开发环境”。
我们(本书的作者)很明显地看到,Microsoft 已经考察了编码的各个方面(包括代码编写本身、调试和部署),而且实际分析了如何才能使这些工作更有效率。这些增强功能影响深远,其中包括 Microsoft Visual Basic .NET 语言本身的改变、IDE 的改进、数据访问和显示的简化,还有一些改变提高了开发人员构造专业用户界面的工作效率,向框架中添加的众许多新类也减少了您编写的代码的数量,同时提高了部署的功能并扩大了部署
关 键 词: Visual Basic 2005 Visual Basic
开发人员的工作效率是这一版 Microsoft Visual Studio 发布的目标。不管您使用何种应用程序类型或者选择何种语言,Microsoft 一直致力于构建集成开发环境 (IDE)、类库和语言套件,以使构建和部署应用程序尽可能地简单。
我们(本书的作者)很明显地看到,Microsoft 已经考察了编码的各个方面(包括代码编写本身、调试和部署),而且实际分析了如何才能使这些工作更有效率。这些增强功能影响深远,其中包括 Microsoft Visual Basic .NET 语言本身的改变、IDE 的改进、数据访问和显示的简化,还有一些改变提高了开发人员构造专业用户界面的工作效率,向框架中添加的众许多新类也减少了您编写的代码的数量,同时提高了部署的功能并扩大了部署的简单性。
本书将深入分析这每一个方面。另外,虽然本书以构建桌面应用程序为重点,但大多数开发人员至少会进行一些 Web 开发。因此,第 6 章“构建 Web 应用程序”介绍 ASP.NET 中的一些最重要的改变。
本简介对这些主题进行概要介绍,并指出您可以从中获得更深层信息的特定章节。您可以通读本书,也可以直接跳到最感兴趣的章节。
本书的读者
本书为 Visual Basic 开发人员撰写。如果您是一名 Visual Basic 6 开发人员,您应该从第 1 章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”开始阅读,该章将带您快速进行 .NET Framework 开发。本书其余部分介绍 Visual Basic 的重要增强功能,这些增强功能可以提高开发应用程序的效率。
如果您已经是一名 .NET 开发人员,则可跳过第 1 章直接进入第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
本书的内容
本书包含八章。第一章“面向 Visual Basic 开发人员的 Microsoft .NET Framework 入门指南”对目前使用 Visual Basic 6 的开发人员最为有用。它介绍 .NET Framework 的开发。
本节对各章进行说明,并提供关于每个主题的介绍性信息。
重要事项要运行本书中的示例,需要安装两个软件:Visual Studio 2005 和 SQL Server 桌面、开发人员版、企业版或桌面引擎版。SQL Server 2000 的安装应该带有 Northwind 示例数据库。代码示例位于 MSDN 上的 http://msdn.microsoft.com/vbasic/VB6Migration。
返回页首
第 2 章,“Visual Basic 2005 的语言增强功能”
本章介绍泛型、My 对象和新的运算符。
泛型.NET Framework 最重要的增强功能可能就是引入了泛型。使用泛型可很轻松地创建特定于所存储的对象类型的集合。
Dim customerDictionaryAs New Dictionary(Of String, Customer)
customerDictionary.Add(currentCust.FullName, currentCust)
本例中,customerDictionary只能存储 Customer 类型的项。而且,查找结果明确是一个 String 值。因为该集合知道它所存储的对象类型(是 Customers 而不仅仅是“对象”),所以它可以提供完整的 Microsoft 智能感知,如下图所示。
图 I-1 泛型集合中的智能感知。
My Object Visual Basic .NET 的另一个重要增强功能就是简称为“My 对象”的功能。该功能提供对强大功能相当快速而简单的访问。例如,My.Application.Log.WriteEntry 可让您将信息写入一个文本文件、事件日志或者其他目标。My.Computer.Audio.PlaySystemSound 可以让您播放预定义的操作系统声音,而 My.Computer.Audio.Play 可以让您播放任何 .wav 文件。My 对象还为项目中的项提供默认实例。例如,您可以使用 My.Forms.MainForm.Show 来显示一个窗体而无需先创建其实例。
新运算符Visual Basic .NET 还包括很多新的关键字。IsNot 和 Nothing 一起使用可以使比较变得更加容易。过去,您通常必须编写 If Not X Is Nothing Then。现在,则这可以写成 If X IsNotNothing Then。Visual Basic .NET 还支持运算符重载、泛型,以及很多其他的高级编程功能。
有关这些增强功能的详细信息,请参阅第 2 章“Visual Basic 2005 的语言增强功能”。
返回页首
第 3 章,“Visual Studio 2005 集成开发环境”
Visual Basic 开发一直以来都与工作效率相关,而提供这种工作效率的关键工具就是 Visual Studio。使用 Visual Studio 2005,可以全面提升工作效率,可以更好、更容易地导航帮助内容,实现更简单的开发环境自定义以及更高效的编码和调试体验,其中包括“编辑并继续 (Edit-And-Continue)”的重新引入。
编码和调试增强功能当使用新的集成开发环境 (IDE) 时,您将看到为了在编码中加入“上下文”而做出的极大努力。即,在很多情况下,您不必导航到 IDE 中的其他窗口来获得需要的信息。在其他情况下,IDE 提供智能信息筛选功能,以便将最有可能的选择置于最突出的位置,并防止极少使用的选项干扰视图。在您第一次访问对象属性时可以看到该功能,如下图所示。
图 I-2 对象成员的渐进式显示。
您会发现,Visual Studio 2005 可以显示对象的所有成员,也可以通过筛选列表只显示最常用的成员,从而使您轻松找到所需的成员(例如,Connection 的 String 属性)。
Visual Studio 2005 还进一步扩展了常见的 Visual Basic 代码展开功能。您已经习惯了在起始处键入 Function 声明,然后让 IDE 自动插入 End Function。现在,这已经扩展到诸如属性声明这样的内容。键入 public property UserName as String并按 Enter 键可以自动插入下列代码:
Public Property UserName() As String
Get
End Get
Set(ByVal value As String)
End Set
End Property
Visual Studio 2005 还在调试时将各种信息置于您容易获得的位置,使您可以方便操作各种简单和复杂类型,而无需打开并浏览“Watch”窗口。下图显示如何直接在代码编辑器中显示一个复杂类型。
图 I-3 就地显示复杂类型的属性。
Visual Basic 6 提供的最大的工作效率增强功能之一就是“编辑并继续”。该功能曾经是调试过程中的主要手段,遗憾的是,以前 Visual Studio .NET 2002 或 2003 中没有包括该功能。现在“编辑并继续”又可以使用了,使您可以修复错误然后继续执行,而不用停止和重新启动。
IDE自定义和帮助系统增强功能Visual Basic 开发人员高度评价了自定义其开发环境,以及将窗口置于对他们最有利位置的功能。Visual Studio 一直都提供这种功能,但是在 Visual Studio 2005 中,该功能在几个关键部分进行了重大增强。首先,Visual Studio 2005 解决了“我不知道该窗口将停靠在何处”这一问题 — 当发生该问题时,虽然您认为已经将窗口进行了正确定位,但是当您放开它时,窗口或者没有停靠,或者没有按照您预期的方式停靠。在 Visual Studio 2005 中,停靠具有“停靠指导”,如下图所示。
图 I-4 使用停靠指导。
您只需将窗口放置到合适的箭头上就可以实现将其停靠在另一个窗口正上方、上方、右方、下方或者左方的功能。不用再猜测!还有,您的所有 IDE 自定义结果都可以导出和导入。
另外,帮助系统有了很大的改进,为您提供了更好的“F1”体验,而且可以让您访问最新的联机帮助。帮助系统甚至挂接到 Web 站点的“Code Wise”社区,它提供直接在 IDE 中访问 CodeGuru、Net247 和 ASP.NET 等站点的功能。
有关 Visual Studio 2005 提供的重要工作效率增强功能的详细信息,您可以直接参阅第 3 章“Visual Studio 2005 集成开发环境”。
VB.NET窗体和新的IDE
Visual Basic.NET中新的面向对象的特性确实不错,但绝不仅仅是你启动VB.NET时见到的那样。你首先看到的是IDE,IDE看起来很熟悉,开发VS.NET IDE的开发人员以前曾开发过VB的IDE,它在VB IDE的基础上又有了新的提高。
然而,IDE的变化绝非是表面性的。所有的.NET语言都使用同一个IDE,其中的新工具的功能是强大而全面的,你可以把任何一个设计窗口设定为自动隐藏(就象Windows中的任务条一样),这样就可以使桌面显得不太凌乱。主工作区是一系列的标签,也就是说IDE不会同时显示许多的窗体或代码模块,在打开对象的源代码时,IDE就会在相应对象的主区内增加新按钮。
IDE中还有一个新的被称作任务清单的窗口,其中的内容包括你和IDE创建的项目。例如,如果在编译一个项目时收到一个错误信息,VB就会在任务清单中创建一个条目来解释这个问题。你还可以直接在任务清单中添加一个条目,或者通过在代码中建立以"TODO:"开头的注释把代码中的一个位置与任务联系起来。我非常喜欢微软添加的任务清单,它能使我节约不少的时间,并有助于我能够更好地调试自己的软件。
另一个会立刻感受到的变化是VB.NET中的窗体。微软抛弃了原来的窗体引擎,而采用了Windows风格的窗体,所有的基于CLR的语言都使用Windows的窗体引擎,与VB6中的使用的窗体引擎相比,它有几个明显的优点。例如,Windows的窗体可以自动地改变其中的组件的大小,而且可以把控制锁定在特定的位置,也就是说,我们无需借助第三方的工具来完成相应的工作了。另外,Windows的窗体还可以使我们完成另外一些很"酷"的工作,例如创建透明的窗体。VB.NET窗体和新的IDE
过去,VB隐藏了创建一个窗体所必需的全部工作。我们使用IDE创建一个窗体,并在Initialize事件处理程序中添加代码,但对于发生在这两者之间的过程则无能为力。在VB.NET中,窗体成了一个类,包含创建窗体的全部代码,我认为这些代码是"鸡肋",原因是大多数的开发人员都不想去理它。VB.NET窗体和新的IDE如果说有一种东西一定能让你的软件出问题,那就是这些代码了。一些高级开发人员可以通过这些代码完成一些很"酷"的工作,因为它可以让你"看到"VB创建窗体的全部情况。如果不想看,你并非必须看这些代码,新的代码编辑器可以扩展或消除一些代码区,在缺省状态下这些代码是不会显示的。代码编辑器还包括一些新的特性,例如它可以自动地对编辑的源代码进行"缩进"处理,而且可以显示源代码的行号。
VB.NET窗体和新的IDE
然而,IDE的变化绝非是表面性的。所有的.NET语言都使用同一个IDE,其中的新工具的功能是强大而全面的,你可以把任何一个设计窗口设定为自动隐藏(就象Windows中的任务条一样),这样就可以使桌面显得不太凌乱。主工作区是一系列的标签,也就是说IDE不会同时显示许多的窗体或代码模块,在打开对象的源代码时,IDE就会在相应对象的主区内增加新按钮。
IDE中还有一个新的被称作任务清单的窗口,其中的内容包括你和IDE创建的项目。例如,如果在编译一个项目时收到一个错误信息,VB就会在任务清单中创建一个条目来解释这个问题。你还可以直接在任务清单中添加一个条目,或者通过在代码中建立以"TODO:"开头的注释把代码中的一个位置与任务联系起来。我非常喜欢微软添加的任务清单,它能使我节约不少的时间,并有助于我能够更好地调试自己的软件。
另一个会立刻感受到的变化是VB.NET中的窗体。微软抛弃了原来的窗体引擎,而采用了Windows风格的窗体,所有的基于CLR的语言都使用Windows的窗体引擎,与VB6中的使用的窗体引擎相比,它有几个明显的优点。例如,Windows的窗体可以自动地改变其中的组件的大小,而且可以把控制锁定在特定的位置,也就是说,我们无需借助第三方的工具来完成相应的工作了。另外,Windows的窗体还可以使我们完成另外一些很"酷"的工作,例如创建透明的窗体。VB.NET窗体和新的IDE
过去,VB隐藏了创建一个窗体所必需的全部工作。我们使用IDE创建一个窗体,并在Initialize事件处理程序中添加代码,但对于发生在这两者之间的过程则无能为力。在VB.NET中,窗体成了一个类,包含创建窗体的全部代码,我认为这些代码是"鸡肋",原因是大多数的开发人员都不想去理它。VB.NET窗体和新的IDE如果说有一种东西一定能让你的软件出问题,那就是这些代码了。一些高级开发人员可以通过这些代码完成一些很"酷"的工作,因为它可以让你"看到"VB创建窗体的全部情况。如果不想看,你并非必须看这些代码,新的代码编辑器可以扩展或消除一些代码区,在缺省状态下这些代码是不会显示的。代码编辑器还包括一些新的特性,例如它可以自动地对编辑的源代码进行"缩进"处理,而且可以显示源代码的行号。
VB.NET窗体和新的IDE
订阅:
评论 (Atom)