Databasklass för Oracle 8x och asp.net 2.0
Förord
Den här något korta artikeln men desto mer kod visar hur du kan skapa tre stycken klasser för att göra den vanligaste anropen mot din oracledatabas. Detta exempel avser att du använder Oracle 8.1.7 eller senare för att kunna nyttja asp.nets inbyggda objekt för att arbeta mot Oracle.Innehåll
Relaterade artiklar
» Förbered ett projekt mot dataklassen» Loopa data från datareader och dataset
» Skapa ett databaslager
» Visa data från sqldatabas via en datagrid
Om du vill installera en gratisversion av Oracle finns Express precis som SQL Servern har. Du finner programmet på där du laddar hem OracleXE.exe och installerar. Det var smidigt att köra in men jag hade en brandväggsprogramvara som ställde till det för mig så om du har problem, kolla om du kan avinstallera det.
Starta VS.NET 2005 och bygg ett nytt projekt. Lägg först till en referens - System.Configuration. Skapa sedan ett nytt projekt i Visual Studio 2005 och skapa en class som du exempelvis döper till databas.cs. Därefter klistrar du in denna kod.
Motsvarande kod i VB.NET
I din web.config eller app.settings kan du använda denna kod för att lägga upp en connectionsträng.
Efter att du gjort dessa moment så kan du göra ett formulär där du exempelvis har en textbox där du skriver en sql-sats och sedan presenterar datat lite enkelt. Ett anrop skulle kunna se ut såhär:
Du kan hämta exempel på detta programmet här.
Starta VS.NET 2005 och bygg ett nytt projekt. Lägg först till en referens - System.Configuration. Skapa sedan ett nytt projekt i Visual Studio 2005 och skapa en class som du exempelvis döper till databas.cs. Därefter klistrar du in denna kod.
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OracleClient;
namespace Database
{
public class Oracle
{
/*
Hämtar connectionsträng från app.config / web.config
om det är en webblösning
*/
static public string GetConnectionString()
{
string connection =
System.Configuration.ConfigurationManager.AppSettings["Connectionstring"].ToString();
return connection;
}
/*
Returnerar datat i form av ett dataset
antingen genom anrop från en sql-fråga eller lagrad procedur
*/
static public DataSet ReturnDataset(string sqlQuery)
{
try {
using (OracleConnection myConnection = new OracleConnection(GetConnectionString()))
{
myConnection.Open();
DataSet myDS = new DataSet();
OracleDataAdapter myAdapter = new OracleDataAdapter(sqlQuery,
myConnection);
myAdapter.Fill(myDS);
myConnection.Close();
return myDS;
}
} catch (Exception ex) {
System.Web.HttpContext.Current.Trace.Warn("DatabaseClass-ReturnDataset",
"Error:" + sqlQuery + "-" + ex.Message);
throw new System.SystemException("Fel vid anrop av sql-fråga: " + sqlQuery +
"-" + ex.Message);
}
}
/*
En datareader returneras beroende på vad du skriver för fråga. Du kan ange både
en sql-sats men även skriva namn på procedur och dess inparametrar
*/
static public OracleDataReader ReturnDataReader(string sqlQuery)
{
try {
OracleConnection myConnection = new
OracleConnection(GetConnectionString());
myConnection.Open();
OracleCommand myCommand = new OracleCommand(sqlQuery,
myConnection);
myCommand.CommandType = System.Data.CommandType.Text;
OracleDataReader Result =
myCommand.ExecuteReader(CommandBehavior.CloseConnection);
return Result;
} catch (Exception ex) {
System.Web.HttpContext.Current.Trace.Warn("DatabaseClass-ReturnDataReader", "Error:" +
sqlQuery + "-" + ex.Message);
throw new System.SystemException("Fel vid anrop av sql-fråga: " + sqlQuery +
"-" + ex.Message);
}
}
/*
Exekverar ditt data. Du kan antingen ange en sql-sats eller en lagrad procedur som indata
Ex: Insert into Emp (field1, field2) values('1','Sample insert')
Ex: EmpInsert ('1','Sample insert')
*/
static public void ExecuteQuery(string sqlQuery) {
try {
OracleConnection myConnection = new OracleConnection(GetConnectionString());
myConnection.Open();
OracleCommand myCommand = new OracleCommand(sqlQuery,myConnection);
myCommand.CommandType = System.Data.CommandType.Text;
myCommand.CommandText = sqlQuery;
myCommand.ExecuteNonQuery();
myConnection.Close();
} catch (Exception ex) {
System.Web.HttpContext.Current.Trace.Warn("DatabaseClass-ExecuteQuery",
"Error:" + sqlQuery + "-" + ex.Message);
throw new System.SystemException("Fel vid anrop av sql-fråga: " + sqlQuery +
"-" + ex.Message);
}
}
}
}
Motsvarande kod i VB.NET
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Data
Imports System.Data.OracleClient
Namespace Database
Public Class Oracle
Public Shared Function GetConnectionString() As String
Dim connection As String =
System.Configuration.ConfigurationManager.AppSettings("Connectionstring")
Return connection
End Function
Public Shared Function ReturnDataset(ByVal sqlQuery As String) As DataSet
Try
' Using
Dim myConnection As OracleConnection = New OracleConnection(GetConnectionString)
Try
myConnection.Open
Dim myDS As DataSet = New DataSet
Dim myAdapter As OracleDataAdapter = New OracleDataAdapter(sqlQuery,
myConnection)
myAdapter.Fill(myDS)
myConnection.Close
Return myDS
Finally
CType(myConnection, IDisposable).Dispose()
End Try
Catch ex As Exception
System.Web.HttpContext.Current.Trace.Warn("DatabaseClass-ReturnDataset", "Error:"
+ sqlQuery + "-" + ex.Message)
Throw New System.SystemException("Fel vid anrop av sql-fråga: " + sqlQuery + "-" +
ex.Message)
End Try
End Function
Public Shared Function ReturnDataReader(ByVal sqlQuery As String) As OracleDataReader
Try
Dim myConnection As OracleConnection = New OracleConnection(GetConnectionString)
myConnection.Open
Dim myCommand As OracleCommand = New OracleCommand(sqlQuery,
myConnection)
myCommand.CommandType = System.Data.CommandType.Text
Dim Result As OracleDataReader =
myCommand.ExecuteReader(CommandBehavior.CloseConnection)
Return Result
Catch ex As Exception
System.Web.HttpContext.Current.Trace.Warn("DatabaseClass-ReturnDataReader",
"Error:" + sqlQuery + "-" + ex.Message)
Throw New System.SystemException("Fel vid anrop av sql-fråga: " + sqlQuery + "-" +
ex.Message)
End Try
End Function
Public Shared Sub ExecuteQuery(ByVal sqlQuery As String)
Try
Dim myConnection As OracleConnection = New OracleConnection(GetConnectionString)
myConnection.Open
Dim myCommand As OracleCommand = New OracleCommand(sqlQuery,
myConnection)
myCommand.CommandType = System.Data.CommandType.Text
myCommand.CommandText = sqlQuery
myCommand.ExecuteNonQuery
myConnection.Close
Catch ex As Exception
System.Web.HttpContext.Current.Trace.Warn("DatabaseClass-ExecuteQuery", "Error:" +
sqlQuery + "-" + ex.Message)
Throw New System.SystemException("Fel vid anrop av sql-fråga: " + sqlQuery + "-" +
ex.Message)
End Try
End Sub
End Class
End Namespace
I din web.config eller app.settings kan du använda denna kod för att lägga upp en connectionsträng.
Efter att du gjort dessa moment så kan du göra ett formulär där du exempelvis har en textbox där du skriver en sql-sats och sedan presenterar datat lite enkelt. Ett anrop skulle kunna se ut såhär:
using System.Text;
using System.Windows.Forms;
using System.Data.OracleClient;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnQuit_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void btnRun_Click(object sender, EventArgs e)
{
OracleDataReader dr = Database.Oracle.ReturnDataReader(textBox2.Text);
int fields = dr.FieldCount-1;
while (dr.Read())
{
for (int a = 0; a <= fields; a++) {
textBox3.Text += dr[a].ToString() + "|";
}
textBox3.Text += "\r\n";
}
dr.Close();
}
}
}
Du kan hämta exempel på detta programmet här.
Daniel Carlsson
Inte för att vara taskig men detta är nog ett av de bättre exemplen på hur man inte skall använda Oracle. Att köra sqler mot oracle utan att använda bind variables är helt förkastligt. Mvh Daniel Carlsson
Pelle Johansson
Vi har nu kört dessa i 1 år åt två kunder och det har fungerat klanderfritt. Daniel lovade återkomma men har inte gjort det, hoppas han gör det framöver..