Gå til innhold

Windows Mobile og database access


Anbefalte innlegg

Hei folkens

 

Har følgende utfordring:

Jeg skal lage et timeregistrerings program som skal brukes i Windows Mobile. Vi har ifra før et timeregistreringsprogram i Windows, men det er aktuellt å tillate å registrere timene mens man ikek er på kontoret. Derfor er jo Smart Phone et glimrende alternativ.

 

Det jeg lurer på er hvordan jeg kan tilkoble til en SQL server.

 

Optimalt ønsker jeg fullstendig automatikk. Det vil si at når mobilen kobles til en PC eller et trådløst nett så skal den automatisk søke etter en SQL server. Og hvis denne blir funnet så skal bruker bli bedt om å synkronisere.

 

Alle tips mottas med takk.

Lenke til kommentar
Videoannonse
Annonse

Databasedesignprogrammet mitt har støtte for å lete etter SQL server, her er koden for den delen:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace orsaDB
{

public class DatabaseInfo
{
	protected string m_server_name;
	protected string m_instance_name;
	protected IPHostEntry m_host;
	protected int m_tcp_port;
	public string ServerName { get { return m_server_name; } }
	public string Instance { get { return m_instance_name; } }
	public IPHostEntry Host { get { return m_host; } }
	public int TcpPort { get { return m_tcp_port; } }
	public DatabaseInfo(string server_name, string instance, int port)
	{
		m_server_name = server_name;
		m_instance_name = instance;
		m_tcp_port = port;
		m_host = Dns.GetHostEntry(m_server_name);
	}
}

public delegate void FoundDataBase(DatabaseInfo db);
public delegate void SearchEnded(bool success);

public class MSSQLDatabaseFinder
{
	private System.Threading.Thread th;
	private FoundDataBase m_callback;
	private SearchEnded m_ended;
	private int m_timeout;
	public void BeginFind(FoundDataBase callback, SearchEnded end, int timeout)
	{
		m_callback = callback;
		m_ended = end;
		m_timeout = timeout;
		th = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc));
		th.Start();
	}
	public void Find(FoundDataBase callback, SearchEnded end, int timeout)
	{
		m_callback = callback;
		m_ended = end;
		m_timeout = timeout;
		ThreadProc();
	}

	private DatabaseInfo ParsePackage(string pack)
	{
		int index = pack.IndexOf('');
		if (index > 0)
			pack = pack.Substring(index + 1);
		var m_info = new Dictionary<string,string>();
		string[] items = pack.Split(';');
		for (int i = 0; i < items.Length; i += 2)
		{
			m_info.Add(items[i], items[i + 1]);
		}
		string server_name;
		string instance_name;
		string port;
		int new_port = -1;
		m_info.TryGetValue("ServerName", out server_name);
		m_info.TryGetValue("InstanceName", out instance_name);
		if (m_info.TryGetValue("tcp", out port))
			new_port = int.Parse(port);

		return new DatabaseInfo(server_name, instance_name, new_port);

	}
	private void ThreadProc()
	{
		var sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

		sock.EnableBroadcast = true;
		sock.ReceiveTimeout = m_timeout;

		sock.SendTo
			(
			new byte[] { 0x02 },
			new IPEndPoint(IPAddress.Broadcast, 1434)
			);

		var success = false;
		var data_buffer = new byte[256];
		try
		{
			// Loop until timeout
			while (true)
			{
				int len = sock.Receive(data_buffer);
				if (len > 0)
				{
					success = true;
					var new_data = new byte[len];
					Array.Copy(data_buffer, new_data, len);
					string info = Encoding.ASCII.GetString(new_data);

					m_callback(ParsePackage(info));
				}
			}
		}
		catch (SocketException)
		{
			// Search has ended in timout probably.
		}
		if (m_ended != null)
			m_ended(success);
		th = null;
	}
}
}

 

Bruk BeginFind eller Find for å lete etter databaser.

Endret av GeirGrusom
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...