Just nu i M3-nätverket
Jump to content

3-skikts-modell - MySql och C#


Micke_skane

Recommended Posts

Försöker utveckla en variant i 3-skikts-modellen där det dyker upp följande felmeddelande:

Cannot implicitly convert type 'void' to 'System.Data.SqlClient.SqlConnection'

Pekar på rad 45 i DataLayer.Data.cs:

connection=dbCon.Open();

Vidare vill jag kunna köra parametiserande frågor men kan inte se/förstå hur det ska "blandas in" i detta och hur bygger man upp det i LoadNews()!?

Och är det i LoadNews som själva loopningen av databasinfo sker och där man bygger upp en DropDown(DDListNews) i news.aspx med hjälp av ListItem li = new ListItem() osv...?

Man bör väl även skapa ett MySqlCommand-object?

 

DataLayer.Data.cs

[log]

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using MySql.Data;
using MySql.Data.MySqlClient;

namespace Bow.Data
{
public static class DataFactory
{
	private static SqlConnection connection;
	private enum DatabaseState { Closed, Open };

	public static SqlDataReader SqlRead(string query)
	{
		SqlDataReader reader=null;
		DatabaseState state=(connection.State==ConnectionState.Open)?DatabaseState.Open:DatabaseState.Closed;
		if (state==DatabaseState.Closed)
		{
			state=OpenConnection();
		}
		if (state == DatabaseState.Open)
		{
			// Kör din fråga här och returnera readern
			return reader;
		}
		else
		{
			return null;
		}
	}
	private static DatabaseState OpenConnection() 
	{
		DatabaseState state=DatabaseState.Closed;
		// Öppna en koppling och spara i connection
           string MyConnStr = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
           MySqlConnection dbCon = new MySqlConnection(MyConnStr);
           connection=dbCon.Open();
		return state;
	}
	public static void CloseConnection()
	{
		if (connection != null && connection.State != ConnectionState.Closed)
		{
			connection.Close();
		}
	}
}
}

[/log]

BusinessLayer.Data.cs

[log]

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

namespace Bow.CustomerData
{

   public class Customer
   {
       private int ID;
       private string name;

       public string Name
       {
           get { return name; }
           set { name = value; }
       }

       public Customer()
       {
       }
       public void LoadNews()
       {
           SqlDataReader reader = Bow.Data.DataFactory.SqlRead(String.Concat("SELECT fldBlankare FROM tblnyheter ORDER BY fldNyhetId DESC", ID.ToString()));
           if (reader != null)
           {
               reader.Read();
               Name = Convert.ToString(reader["Name"]);
               reader.Close();
           }
       }
   }
}

[/log]

GetInfo.aspx.cs

[log]

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class content_en_Default : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
       Bow.CustomerData.Customer customer;
       customer = new Bow.CustomerData.Customer();
       customer.LoadNews();
       string Name = customer.Name;

       Bow.Data.DataFactory.CloseConnection();
   }
}

[/log]

news.aspx

[log]

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GetInfo.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
   <link href="StyleSheet.css" rel="stylesheet" type="text/css" />
   <title>Mickes nyhetssida</title>
</head>
<body>
   <form id="form1" runat="server">
       <div>
           <center>
               Det finns
               <asp:Label ID="lblCount" Font-Bold="true" runat="server"></asp:Label>
               nyheter
               <br />
               <br />
               <asp:Label ID="lblNoMessages" runat="server"></asp:Label>
               <asp:DropDownList ID="DDListNews" runat="server">
               </asp:DropDownList>
           </center>
       </div>
   </form>
</body>
</html>

[/log]

[inlägget ändrat 2008-09-14 09:16:38 av Micke_skane]

Link to comment
Share on other sites

Cannot implicitly convert type 'void' to 'System.Data.SqlClient.SqlConnection'

Detta fel får du eftersom du försöker tilldela connection ett returvärde från en metod som inte returnerar något (SqlConncetion.Open)

 

Vidare så nämner du MySqlCommand, men om du använder mySql, varför använder du då SqlClient? Denna namespace är optimerad för och enbart till för SQL Server-databaser.

Men annars är svaret ja. Du skapar ett xxxCommand-objekt, lägger till önskat antal xxxParameter-instanser för parametrarna, anger dess CommandType och CommandText och anger vilken xxxConnection som skall användas. (Denna skall vara öppnad). Slutligen kör du allt med önskad metod, ex. ExecuteNonQuery eller ExecuteReader .

 

 

I övrigt var det för generellt ställda frågor och för mycket kod för att jag ska orka svara på, annat än att du kan göra dina loopningar mer eller mindre hur du vill och var du vill. Du kan även använda DataBind för att koppla kontroller mot en datamängd.

 

Link to comment
Share on other sites

Vidare så nämner du MySqlCommand, men om du använder mySql, varför använder du då SqlClient? Denna namespace är optimerad för och enbart till för SQL Server-databaser.
Ja, förstod det efter ett tag. Men det är MySql som kommer att användas.

 

Detta fel får du eftersom du försöker tilldela connection ett returvärde från en metod som inte returnerar något (SqlConncetion.Open)
Okej, är inte helt med på var i kdoen du menar det felar.

 

Detta är en variant du viasde mig för ett tag seda som jag gärna skulle vilja få igång.

Jag vill utveckla egna tankar därifrån, bara själva MySql-databaskopplingen(i 3-skiktslösningen) blir rätt någon gång...

 

Vet du hur man kollar DataBaseState för MySql, letat men inte funnit något...

 

Link to comment
Share on other sites

Okej, är inte helt med på var i kdoen du menar det felar.

Precis där den kodrad ligger som du bifogade =)

connection=dbCon.Open();

 

På sista frågan svarar jag så här: Jag har aldrig jobbat med MySql under .Net, men har de implementerat sina klasser korrekt så skall MySqlConnection implementera interfacet IDbConnection och då har den en Property som heter State.

 

Har du tillgång till hela dokumentation för Net Framework (MSDN Library) så kan du i princip titta på referensdokumentationen för de interface som databasklasserna måste implementera. Alla metoder och egenskaper i dessa interface måste implementeras, oavsett tredjepartsleverantör och specifikationen ska se exakt likadan ut.

 

De interface som i huvudsak är intressanta att leta upp i dokumentationen är:

För Connection-klasser: IDbConnection

För Command-klasser: IDbCommand

För Parameter-klasse: IDbDataParameter och IDataParameter samt klassen DbParameter

 

Link to comment
Share on other sites

Precis där den kodrad ligger som du bifogade =)
Jo, Det var jag med på :) men var finns void-metoden med databasöppningen.

De enda void-metoden, jag ser, är ju CloseConnection().

Eller är det så att en static-metod inte heller returnerar något?

 

Det "andra" får jag kolla upp!

 

(tror det är 511:de-gången jag försöker få till detta :) )

 

[inlägget ändrat 2008-09-14 12:20:00 av Micke_skane]

Link to comment
Share on other sites

men var finns void-metoden med databasöppningen.

dbCon är ju ett Connection-objekt och ett Connection-objekts Open-metod har följande definition, dvs. den har inget inget returvärde:

public override void Open ()

 

Men det skumma du gjort i din DataFactory är att du dels skapat en SqlConnection (connection) och en MySqlConnection(dbCon). Ändra din DataFactory till följande

public static class DataFactory
{
	private static MySqlConnection connection;
	private enum DatabaseState { Closed, Open };

	public static SqlDataReader SqlRead(string query)
	{
		SqlDataReader reader=null;
		DatabaseState state=(connection.State==ConnectionState.Open)?DatabaseState.Open:DatabaseState.Closed;
		if (state==DatabaseState.Closed)
		{
			state=OpenConnection();
		}
		if (state == DatabaseState.Open)
		{
			// Kör din fråga här och returnera readern
			return reader;
		}
		else
		{
			return null;
		}
	}
	private static DatabaseState OpenConnection() 
	{
		DatabaseState state=DatabaseState.Closed;
		// Öppna en koppling och spara i connection
           string MyConnStr = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
           connection = new MySqlConnection(MyConnStr);
           connection.Open();
		return connection.State;
	}
	public static void CloseConnection()
	{
		if (connection != null && connection.State != ConnectionState.Closed)
		{
			connection.Close();
		}
	}
}

 

 

Eller är det så att en static-metod inte heller returnerar något?

Statisk eller ej har inget med returtypen att göra. Att en metod är statisk betyder bara att den tillhör klassen och inte en enskild klassinstans.

 

 

[inlägget ändrat 2008-09-14 14:12:57 av Anjuna Moon]

Link to comment
Share on other sites

Ändrade och då försvann det felet och ett nytt dök upp:

Cannot implicitly convert type 'System.Data.SqlClient.SqlDataReader' to 'MySql.Data.MySqlClient.MySqlDataReader'

 

Pekar på följande:

MySqlDataReader reader = Bow.Data.DataFactory.SqlRead(String.Concat("SELECT fldBlankare FROM tblnyheter ORDER BY fldNyhetId DESC", ID.ToString()));

I detta kodblock(affärslagret):

public void LoadNews()
       {
           MySqlDataReader reader = Bow.Data.DataFactory.SqlRead(String.Concat("SELECT fldBlankare FROM tblnyheter ORDER BY fldNyhetId DESC", ID.ToString()));
           if (reader != null)
           {
               reader.Read();
               Name = Convert.ToString(reader["Name"]);
               reader.Close();
           }
       }

 

Ska det verkligen vara:

public static SqlDataReader SqlRead(string query)

i datalagret? Då pekar man väl på en klass för SQL Server och inte att det handlar om MySql!?

 

Ändrade till:

public static MySqlDataReader SqlRead(string query)

Då försvann det felet, som jag tyder som att:

MySqlDataReader reader = Bow.Data.DataFactory.SqlRead(...)

försöker blanda MySql med SQL Server i datalagret.

Ändrade alla SqlDataReader i metoden SqlRead() till MySqlDataReader eftersom SqlRead() inte kunde returnera reader(fel sorts antagligen...).

 

Det felet försvann nu i alla fall men nu dök dock ett annat fel upp:

Cannot implicitly convert type 'System.Data.ConnectionState' to 'Bow.Data.DataFactory.DatabaseState'. An explicit conversion exists (are you missing a cast?)

 

Pekar på:

return connection.State;

i DatabaseState OpenConnection() i datalagret.

Vad kan detta nu innebära, förstår att det inte är rätt typ men varför/hur är det inte det?

 

[inlägget ändrat 2008-09-14 15:31:33 av Micke_skane]

Link to comment
Share on other sites

Vad kan detta nu innebära, förstår att det inte är rätt typ men varför/hur är det inte det?

Det finns ju ingen korrelering mellan din enum och System.Data.ConnectionState-enumereringen så det blir nog omöjligt att ens göra en explicit cast i det här fallet. Varför vill du förresten ha en egen enum när du redan har en fördefinierad?

 

 

 

Link to comment
Share on other sites

Varför vill du förresten ha en egen enum när du redan har en fördefinierad?
Ja, det vet inte jag ;)

Var är/blir den fördefinierad?

Det är ett ex du skrev till mig(för ett halvår-sedan) som "grund" ang 3-skiks-modellen.

Hittade tråden:

//eforum.idg.se/viewmsg.asp?entriesid=1034568#1036862

 

Vad vill du ha för att göra ett ex som fungerar åt mig och som jag kan "se på" och lära av? ;)

Visst, jag hade redan löst allt i klassisk Asp men det vill jag Inte nu längre.

 

[inlägget ändrat 2008-09-14 16:11:50 av Micke_skane]

Link to comment
Share on other sites

Var är/blir den fördefinierad?

I System.Data är enum:et System.Data.ConnectionState deklarerat. Eftersom det är denna enum som returneras från MySqlConnection.State så kan du ju lika gärna använda denna. Strunta i mitt gamla exempel, det finns ingen mening att använda en egen enum som i princip ändå bara speglar den fördefinierade.

 

Hinner tyvärr inte skriva om ditt exempel, har alldeles för mycket att göra för tillfället. Men arbete bort alla egendefinierade DatabaseState och ersätt med connection.State istället. Returtypen för OpenConnection skall ändras till System.Data.ConnectionState

 

 

 

 

Link to comment
Share on other sites

Okej, tack för hjälpen så länge!

Skulle du känna ett "kall ifrån ovan" för att skriva ett ex innan jag själv löst det så får du hojta till ;)

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...