|
Hello all,
happy holidays, when you get thus far.
I'd much appreciate your thoughts on this issue: I need to transfer a bunch of images from a server to a winforms application. Approximiately 30-40 group4fax tiff's at an unknown size. I haven't as yet decided on the architecture. I thought I'd go with a WCF service and transfer the images as byte arrays, pre-loaded to server-memory. Would this procedure seem recommended for this task? The aim, naturally, is to transfer the least amount of bytes to the client, to allow for the best response-time. I've noticed when I convert the images to byte arrays, these arrays triple in size, so I guess that's not the best way to go 'round the issue of limiting the client's download time.
All your thoughts are surely appreciated, thanks in advance,
Morten
|
|
|
|
|
If you just send the bytes of the image, there's no way they can 'triple in size'. If you were to turn them into a bitmap and send that data, they will get a lot bigger. Send the tiff data directly, and then stuff that into a stream and read it into a bitmap from there on the other end. The compression you will find in formats like tiff/jpeg/png are as good as you'll get. Perhaps converting to jpg will make them smaller, it's worth a try.
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
harleydk wrote: I've noticed when I convert the images to byte arrays, these arrays triple in size
I assume you mean when byte arrays are encoded in Base64 which I assume is needed for WCF byte[] transfers. Then it is normal.
xacc.ide - now with TabsToSpaces support IronScheme - 1.0 beta 1 - out now! ((lambda (x) `((lambda (x) ,x) ',x)) '`((lambda (x) ,x) ',x))
|
|
|
|
|
Good point - I didn't think of that.
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
But Triple the size? Base64 should be 1/3rd larger, right?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi,
I'd like to display the build number of my application in a text box.
I tried with "txtApplicationVersion.Text = Application.ProductVersion;"
but that did not give the correct value.
Could someone point me in the right direction?
Thanks very much for your help,
Albert
|
|
|
|
|
Hi,
I suggest you try Assembly.GetExecutingAssembly().GetName().Version.ToString() or have a look at the properties of Assembly.GetExecutingAssembly().GetName().Version
[EDIT]
Although I expect Application.ProductVersion to return the same string.
You do have a [assembly: AssemblyVersion("1.0.*")] somewhere, do you?
e.g. in file AssemblyInfo.cs; make sure there is an asterisk in that line, that is how you tell
Visual to modify the version upon every build.
[/EDIT]
modified on Saturday, December 20, 2008 12:50 PM
|
|
|
|
|
I'm also a newbie, and I use Click once for deployment. I get a publish version from Click Once and I want to display this number in the info box.
To display the publish version use the following code:
=======================================
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
Version version = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.CurrentVersion;
string versionString = version.ToString();
}
========================================
Please notice this works only on deployed versions (IsNetworkDeployed)
The other possiblity is the assembly version. You can set the assembly version manualy in the assembly file (found as a subfile under the properties item in the solution explorer). Or you can have an automatic assembly number with the number of days since jan 1, 2000 as build number and the number of seconds (divided by two) as the revision number by [assembly: AssemblyVersion("1.0.*")]
I hope to have cleared confussion.
|
|
|
|
|
Hello i am new to this place and thought id have a look around before i post a question but i was unable to find the answer to my problem.
I am very new to c# and creating winform application and require a login that will allow access to the application window.
I am using a mysql database with phpmyadmin and trying to autheticate the login using a ole db connection.
I have been trying to get this working for a while now and have made some progress but i am now getting the ERROR MESSAGE: (MYsql prov provider is not registered on the local machine) when ever i run the application and input a username and password and click OK.
Any help would greatly be appreciated.
Thanks in advacnced
My code is below:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
namespace _Consultants
{
public partial class Form1 : Form
{
public static string ConnectionString = "Provider=MySQLProv;Data Source=_consultants;User Id=root;Password=password;";
public Form1()
{
InitializeComponent();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
OleDbConnection myConnection = new OleDbConnection(ConnectionString);
string uname;
string pword;
try
{
uname = textBox1.Text;
pword = textBox2.Text;
{
OleDbCommand myCommand = new OleDbCommand("Select count(*) from user where username = ' " + textBox1.Text + " 'and password=' " + textBox2.Text + " ' ");
myCommand.Connection = myConnection;
myConnection.Open();
int count = Convert.ToInt16 (myCommand.ExecuteScalar());
// Notice the double equal signs.
// Double equal signs are a comparison.
// Single equal signs are an assignment.
if (count > 0)
{
main_screen main = new main_screen();
main.Show();
this.Hide();
}
else
{
Application.Exit();
}
}
}
catch (Exception ex)
{
myConnection.Close();
MessageBox.Show("Wrong Input Entered", "Window Information"+ex.Message.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
}
|
|
|
|
|
cobalt-rose wrote: ole db connection.
Oledb is slow. MySQL provides a managed library. You can get it here[^].
|
|
|
|
|
Thank you for the reply.
I have previously tried to get the mysql client but when i added the extension in my code it kept on saying that it couldnt find it or something.
Im downloading this at the moment is this correct http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-essential-5.1.30-win32.msi/from/pick )
Do i download the essentials/Zip/ or Without installer packages?
Also once installed do i need to put them anywhere specific like a bin file or httdocs or something?
Thanks in advanced.
C~Rose
|
|
|
|
|
You say you're getting an error message, but what is it ?
Why don't you use SQL Server, instead of MySQL ? There's better support for that built right in to .NET. having said that, there's no reason why this shouldn't work, but we can't tell you what's going wrong without seeing the error.
cobalt-rose wrote: OleDbCommand myCommand = new OleDbCommand("Select count(*) from user where username = ' " + textBox1.Text + " 'and password=' " + textBox2.Text + " ' ");
1 - give your variables real names, unless you want to write unreadable code
2 - read the articles on SQL injection, this code means someone who is not logged in, can erase your entire database, or quite possibly guess how to side step the login process, if they guess that you're expecting a number to be returned.
So, once someone is logged in, you don't use the database for anything else that's specific to one user ?
Christian Graus
Driven to the arms of OSX by Vista.
|
|
|
|
|
I use MySql in combination with C# as well. To answer the question from Cristian why using MySql instead of SQLServer: to get the best of both worlds, and have a rich user interface with a windows forms application, combined with a database that can be reached over the internet.
First of all, use the MySQL .net components provided by MySql, and create a reference to it in your projects. Don't forget the using statement:
using MySql.Data.MySqlClient;
I then use a number of standard functions like:
public static bool RunSQL(string sql, string ConnectString)
{
MySqlConnection ConnMySQL;
MySqlCommand cmdMySql = new MySqlCommand();
ConnMySQL = new MySqlConnection(ConnectString);
cmdMySql.Connection = ConnMySQL;
try
{
ConnMySQL.Open();
//Execute SQL
cmdMySql.CommandText = sql;
cmdMySql.ExecuteNonQuery();
}
catch (Exception e)
{
System.Windows.Forms.Clipboard.SetText(sql);
if (e.Message.ToString().IndexOf("Duplicate entry") < 0)
{
System.Windows.Forms.MessageBox.Show(e.Message);
}
return false;
}
finally
{
ConnMySQL.Close();
}
return true;
}
The connectstring is something like:
public static string ConnectString()
{
string Connectstring = @"server=yourservername;uid=yourusername;pwd=yourpassword;database=yourdatabasename;";
return Connectstring;
}
I hope this will get you on the right track
|
|
|
|
|
Hey i am now going to use Mysql to connect instead of ole db as i have been told that it is quicker...
How do i actually incoporate the mysql connection example into my program?
Do i need to put this code in every time that i need to connect to the database? or do i just put it at the top of the code?
Also how do i get the mysql.data.mysqlclient import as when i put it in my code i get the error:
"The type or namespace 'MySql' could not be found (are you missing a using directive or an assembly reference?"
Do i need to download the dll? and if so in which folder too?
|
|
|
|
|
If you want to create more applications connected to a MySQL database in the future, it is best to create a separate project in your current solution.
Download the dll from MySQL, the folder is not important. In the new project rightclick on references and choose "add new reference". Browse to the downloaded dll and create the reference.
Create a new class in your new MySQL project and make the functions you need.
In your original project add a reference to your new MySQL project, and you can use the functions in your project.
This sounds easy but will still be a lot of work, if you need further help please state your level of experience with MySQL and SQL.
Regards,
|
|
|
|
|
Hey i have managed to get the mysql reference working and can now use the mysql.dll...
I have tried to alter my code using somebody elses code as a basis... My problem at the moment is that i get the error messages : "The name textBOx3 does not exist in the current context" and also "The name MySqlConn does not exist in the current context" Why is this suddenly occuring?
I am still unsure how to go about authorising the login e.eg opening up screen 2 when the username and password are found in the database?
(I'm very new to c# and programming in general)
Thanks in advance,
C~Rose
Code Below:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using MySql.Data.MySqlClient;
namespace _Consultants
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string uname;
string pword;
try
{
uname = textBox1.Text;
pword = textBox2.Text;
{
string connectionString = "Data Source=localhost" + ";Database=_consultants" + ";User ID=root" + ";Password=password;";
MySqlConnection MySqlConn = new MySqlConnection(connectionString);
string strSQL = ("SELECT (*) FROM user where username = ' " + textBox1.Text + " 'and password=' " + textBox2.Text + " ' ");
MySqlCommand mysqlCommand = new MySqlCommand(strSQL, MySqlConn);
MySqlConn.Open();
String strResult = String.Empty;
strResult = (String)mysqlCommand.ExecuteScalar();
MySqlConn.Close();
if (strResult.Length == 0)
{
textBoxt3.Text = "INCORRECT USER/PASS!";
//could redirect to register page
}
else
{
textBox3.Text = "YOU ARE LOGGED IN!";
//set loggin in sessions variables
}
}
}
catch (Exception ex)
{
MessageBox.Show("Wrong Input Entered", "Window Information" + ex.Message.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Information);
MySqlConn.Close();
}
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
}
}
|
|
|
|
|
The messages mean exactly what they say. C# is case sensitive which means textBox3 is something else than textBOx3.
I also found this line:
textBoxt3.Text = "INCORRECT USER/PASS!";
watch the t after textBox and before the 3!
I can't find the error with MySqlConn, but it must be the same thing. Check the line with the error.
Regards,
|
|
|
|
|
Thank you for the tip, i am learning something new about c# with every message that you send.
Back to the problem, i did stuble across another person that was trying to get the login working and he said he managed to do so in the end so i have borrowed his code and adapted it....
It seems to almost correct except for when i click on the login button it waits a while and then says "you have an error in your SQL Syntax check the ,manual that" is this to do with the connection string of the actual SQL query? I feel that if i can correct this then it should work as it is the only erro that comes up when run? As always your help will be greatly appreciated.
C~Rose
Link to borrowed code http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/764cdca8-8464-497e-ac15-daab9d748724/br mode="hold" />My Code Below:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using MySql.Data.MySqlClient;
namespace _Consultants
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string uname = textBox1.Text;
string pword = textBox2.Text;
string connectionString = "Data Source=localhost" + ";Database=_consultants" + ";User ID=root" + ";Password=password;";
MySqlConnection MySqlConn = new MySqlConnection(connectionString);
string strSQL = ("SELECT (*) FROM user WHERE username = ' " + textBox1.Text + " 'AND password=' " + textBox2.Text + " ' ");
MySqlCommand mysqlCommand = new MySqlCommand(strSQL, MySqlConn);
try
{
MySqlConn.Open();
MySqlDataReader mysqlReader = mysqlCommand.ExecuteReader();
while (mysqlReader.Read())
{
string strusername;
string strpassword;
strusername = (mysqlReader["username"].ToString());
strpassword = (mysqlReader["password"].ToString());
if (strusername == uname && pword == strpassword)
{
textBox3.Text = "INCORRECT USER/PASS!";
}
else
{
textBox3.Text = "YOU ARE LOGGED IN!";
}
}
MySqlConn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Wrong Input Entered", "Window Information" + ex.Message.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
}
}
|
|
|
|
|
MySql isn't always very helpfull in it's error messages. When something like this occurs you can best make a messagebox with the sql.
I'm not sure about the () in Select (*), I always use Select *. Definately wrong is the absence of a space before -AND-
Your code:
textBox1.Text + " 'AND password=
Must be
textBox1.Text + " ' AND password=
It's subtle but the space is important.
Rob
|
|
|
|
|
Ok i have ironed out those errors now and when i run and click the login button the hello displays in textbox3.text so i am guessing that everything works up until that point?
But other than the hello appearing nothing else happens...it just does nothing (does not go to the exception and bring up error mesasge either).
In the lines : string strusername;
string strpassword;
strusername = (mysqlReader["username"].ToString());
strpassword = (mysqlReader["password"].ToString());
are "username" and "password" meant to be the name of the tables in my database? because that is what i have done.
My Updated code below:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
using MySql.Data.MySqlClient;
namespace Deroche_Consultants
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string uname = textBox1.Text;
string pword = textBox2.Text;
string connectionString = "Data Source=localhost" + "; Database=deroche_consultants" + "; User ID=root" + "; Password=password;";
MySqlConnection MySqlConn = new MySqlConnection(connectionString);
string strSQL = ("SELECT * FROM user WHERE username= ' " + textBox1.Text + " ' AND password= ' " + textBox2.Text + " ' ");
MySqlCommand mysqlCommand = new MySqlCommand(strSQL, MySqlConn);
MySqlDataReader mysqlReader = null;
textBox3.Text = "hello";
try
{
MySqlConn.Open();
mysqlReader = mysqlCommand.ExecuteReader();
while (mysqlReader.Read())
{
string strusername;
string strpassword;
strusername = (mysqlReader["username"].ToString());
strpassword = (mysqlReader["password"].ToString());
if (strusername == uname && pword == strpassword)
{
main_screen mss = new main_screen();
mss.Show();
}
else
{
textBox3.Text = "YOU ARE LOGGED IN!";
}
}
MySqlConn.Close();
}
catch (Exception ex)
{
MessageBox.Show("Wrong Input Entered", "Window Information" + ex.Message.ToString(),
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
}
}
|
|
|
|
|
Nothing else happening is exactly what you coded, so it works. Perhaps you want to prove it by changing textbox3 to something that's from the database.
Suppose you have a fullname field in your database (and that's yes to your other question), you extend the code with:
string strfullname = (mysqlReader["fullname"].ToString());
and:
textBox3.Text = "congratulations " + strfullname + ", you are now logged in!";
The first steps are the most difficult, and you've taken them already so keep on experimenting
Rob
|
|
|
|
|
Hey, i was refering to this section of my code:
while (mysqlReader.Read())
{
string strusername;
string strpassword;
strusername = (mysqlReader["username"].ToString());
strpassword = (mysqlReader["password"].ToString());
if (strusername == uname && pword == strpassword)
{
main_screen mss = new main_screen();
mss.Show();
}
else
{
textBox3.Text = "YOU ARE LOGGED IN!";
}
}
isn't the if statement proving that the username and password exists? (in response to; "youve programmed it to do nothing")
isn't the main screen form supposed to open if there is a match between username and password?
and the if else statement textBox3.Text is supposed to show "you are now logged in"?
Neither of these are happening which means that somewhere the code is not working.
Merry Christmas by the way and thanks again for your comments!
|
|
|
|
|
I'm sorry, I didn't look right.
I think there are no records that meet the criteria.
My books says to use a data reader for performance reasons, but I've found that a data reader can even take longer than a dataset, so I always use a data set (perhaps if I make a million records application the datareader comes into play again).
The advantage of the dataset is you can check it in debug mode.
I have a standard function:
public static DataTable dtAlgemeen(string sql, string NaamRetourTabel)
{
MySqlConnection ConnMySQL;
MySqlCommand cmdMySql = new MySqlCommand();
ConnMySQL = new MySqlConnection(ConnectString());
cmdMySql.Connection = ConnMySQL;
try
{
ConnMySQL.Open();
MySqlDataAdapter da = new MySqlDataAdapter();
da.SelectCommand = new MySqlCommand(sql, ConnMySQL);
MySqlCommandBuilder sqlbuilder = new MySqlCommandBuilder(da);
DataSet ds = new DataSet();
da.Fill(ds, NaamRetourTabel );
DataTable dt = ds.Tables[NaamRetourTabel];
return dt;
}
catch (Exception e)
{
System.Windows.Forms.Clipboard.SetText(sql);
System.Windows.Forms.MessageBox.Show("Foutmelding:" + e.Message + Convert.ToChar(13) + e.GetType().ToString() + Convert.ToChar(13) + "SQL is niet uitgevoerd, SQL text gekopieerd naar clipboard");
return null;
}
finally
{
ConnMySQL.Close();
}
}
then I code in my main routine
DataTable dtUsers = dtAlgemeen("Select * from users", "users");
If you put a break on the next line you can see the actual data extracted from the database by clicking on the magnifying glass that appears when you hold the mouse pointer over the dtUsers word.
If the data is satisfactory, you can adjust your code to select only the record with the necessary data
string sql = "Select * from users where username = '" + this.TextBox1.Text + "' And password = '" + this.TextBox2.Text + "'";
dtUsers = dtAlgemeen(sql, "users");
if (dtUsers.Rows.Count ==0)
{
MessageBox.Show("Username does not exist, or Password invalid");
}
else
{
MessageBox.Show("You are now logged in");
//do your other things
}
Use the debugger to check your code line by line to see if the expected result occurs!
Rob
|
|
|
|
|
The documentation of ReaderWriterLockSlim.EnterUpgradeableReadLock says:
"A thread in upgradeable mode can downgrade to read mode or upgrade to write mode."
How do I downgrade the lock to a read lock? The documentation does't tell...
|
|
|
|
|
To upgrade to write mode call EnterWriteLock and to downgrade, call ExitWriteLock
|
|
|
|